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

Artifact 35931467ec026b05babb279cb8a573e62f6fe1a3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1110: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
1120: 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  nt bRunExtraInit
1130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1150: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
1160: 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ion needed */.#e
1170: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1180: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
11a0: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
11b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d0: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
11e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
11f0: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
1200: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
1210: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
1220: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
1230: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1240: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
1250: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
1260: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1270: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
1280: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
1290: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
12a0: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
12b0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
12c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
12f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1310: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 7b  NABLE_SQLLOG.  {
1320: 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1330: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
1340: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
1350: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
1360: 6c 6f 67 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  log();.  }.#endi
1370: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
1380: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1390: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
13a0: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
13b0: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
13c0: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
13d0: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
13e0: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
13f0: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
1400: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
1410: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
1420: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
1430: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
1440: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
1450: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
1460: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
1470: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
1480: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
1490: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
14a0: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
14b0: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
14c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
14d0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
14e0: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
14f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1500: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
1510: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
1520: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
1530: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
1540: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
1550: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1560: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1570: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
1580: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
1590: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
15a0: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
15b0: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
15c0: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
15d0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
15e0: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
15f0: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
1600: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
1610: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
1620: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
1630: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
1640: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
1650: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1660: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
1670: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
1680: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1690: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
16b0: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
16c0: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
16d0: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
16e0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
16f0: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
1700: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1710: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1730: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
1740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1750: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1760: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1770: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1780: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1790: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
17b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
17c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
17d0: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
17e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
17f0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1800: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
1810: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1820: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
1830: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
1840: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1850: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1860: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1870: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
18b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
18c0: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
18d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18e0: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
18f0: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1900: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1910: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1920: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1930: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1940: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1950: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1960: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1970: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1980: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1990: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
19a0: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
19b0: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
19c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19e0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
19f0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1a00: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1a10: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1a20: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1a30: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1a40: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1a50: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1a60: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1a70: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1a80: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a90: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1aa0: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1ab0: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1ac0: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1ad0: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1ae0: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1af0: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1b00: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1b10: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1b20: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1b30: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1b40: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1b50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1b60: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1b70: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1b80: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1b90: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1ba0: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1bb0: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1bc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1bd0: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1be0: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1bf0: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1c00: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1c10: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1c20: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1c30: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1c40: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1c50: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1c60: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1c70: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1c80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c90: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1ca0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1cb0: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1cc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1cd0: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1ce0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cf0: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1d00: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1d10: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1d20: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1d30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1d40: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1d50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d60: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1d70: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1d80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1d90: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1da0: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
1db0: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
1dc0: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
1dd0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1de0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1df0: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
1e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1e10: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
1e20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1e50: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1e60: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
1e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e80: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
1e90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ea0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1eb0: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1ec0: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1ed0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1ee0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1ef0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f00: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
1f10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1f20: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
1f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f40: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
1f50: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1f60: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
1f70: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
1f80: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1f90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fa0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1fb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1fc0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fe0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1ff0: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
2000: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
2010: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
2020: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
2030: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
2040: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
2050: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2060: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2070: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2080: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2090: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
20a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
20b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
20c0: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
20d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
20f0: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
2100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
2110: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
2120: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2130: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
2140: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2150: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2160: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2170: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2180: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2190: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
21a0: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
21b0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
21c0: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
21d0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
21e0: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
21f0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
2200: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
2210: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
2220: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
2230: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
2240: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
2250: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2260: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2270: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2280: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2290: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
22a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
22c0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
22d0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
22e0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
22f0: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
2300: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
2310: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2320: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2330: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2340: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2350: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2360: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2370: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2380: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2390: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
23a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
23b0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
23c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
23d0: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
23e0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23f0: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2400: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2410: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2420: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2430: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2440: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2450: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2460: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2470: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2480: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24a0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
24b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
24c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24d0: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
24e0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
24f0: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2500: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2510: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2520: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2530: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2540: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2550: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2560: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2570: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2580: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2590: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
25a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
25b0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
25c0: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
25d0: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
25e0: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
25f0: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2600: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2610: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2620: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2630: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2640: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2650: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2660: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2670: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2680: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2690: 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  id){.  if( sqlit
26a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
26b0: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
26c0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
26d0: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
26e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
26f0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2700: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2710: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2720: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2730: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2740: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2750: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2760: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2770: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2780: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2790: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
27a0: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
27b0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
27c0: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
27d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27e0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
27f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2800: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2810: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2820: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2830: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2840: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2850: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2860: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2870: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2880: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2890: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
28a0: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
28b0: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
28c0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
28d0: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
28e0: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
28f0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2900: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2910: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2920: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2930: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2940: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2950: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2960: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2970: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2980: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2990: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
29a0: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
29b0: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
29c0: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
29d0: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
29e0: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
29f0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2a00: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2a10: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2a20: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2a30: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2a40: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2a50: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2a60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2a70: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2a80: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2a90: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2aa0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2ab0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2ac0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2ad0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2ae0: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2af0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2b00: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2b10: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2b20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2b40: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2b50: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2b60: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2b70: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2b80: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2b90: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2ba0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bb0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2bc0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2bd0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2be0: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2bf0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2c00: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c10: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2c20: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2c30: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2c40: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2c50: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2c60: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2c70: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2c80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2c90: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2ca0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2cb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cc0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2cd0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2ce0: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2cf0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2d00: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2d10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2d20: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2d30: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2d40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d50: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2d60: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2d70: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
2d80: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
2d90: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
2da0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
2db0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
2dc0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
2dd0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2de0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2df0: 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66   .    */.#if def
2e00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
2e10: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
2e20: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20  E_THREADSAFE>0. 
2e30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2e40: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
2e50: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e60: 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  isable all mutex
2e70: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2e80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2e90: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b  .bCoreMutex = 0;
2ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2eb0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ec0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
2ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ee0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2ef0: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
2f00: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2f10: 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66  able mutexing of
2f20: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2f30: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f  tions */.      /
2f40: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e  * Enable mutexin
2f50: 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73  g of core data s
2f60: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
2f70: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2f80: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2f90: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2fa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fb0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
2fc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2fd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2fe0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41  ITE_CONFIG_SERIA
2ff0: 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f  LIZED: {.      /
3000: 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74  * Enable all mut
3010: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
3020: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3030: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3040: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
3050: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3060: 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  llMutex = 1;.   
3070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3090: 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a  CONFIG_MUTEX: {.
30a0: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79        /* Specify
30b0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
30c0: 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61  mutex implementa
30d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
30e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
30f0: 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72  g.mutex = *va_ar
3100: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
3110: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  tex_methods*);. 
3120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3130: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3140: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
3150: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
3160: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
3170: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
3180: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3190: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
31a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
31b0: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
31c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
31d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20     }.#endif...  
31f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3200: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
3210: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3220: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
3230: 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61  alloc implementa
3240: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3250: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3260: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
3270: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3280: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
3290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
32b0: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
32c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
32d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  e the current ma
32e0: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
32f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
3300: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3310: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
3320: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
3330: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
3340: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
3350: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3360: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3370: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
3380: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3390: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
33a0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
33b0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  US: {.      /* E
33c0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
33d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74   the malloc stat
33e0: 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f  us collection */
33f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3400: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
3410: 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tat = va_arg(ap,
3420: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3430: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3440: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3450: 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20  _SCRATCH: {.    
3460: 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61    /* Designate a
3470: 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72 61   buffer for scra
3480: 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  tch memory space
3490: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
34b0: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
34c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
34d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
34e0: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
34f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3500: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3510: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3520: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3530: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3550: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3560: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3570: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
3580: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
3590: 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72  page cache memor
35a0: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
35b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
35c0: 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f  nfig.pPage = va_
35d0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
35e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
35f0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
3600: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3610: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3620: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
3630: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3640: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3650: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3660: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3670: 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  G_PCACHE: {.    
3680: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
3690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
36a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
36b0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
36c0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
36d0: 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  w an error */.  
36e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36f0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3700: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3710: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3720: 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  G_PCACHE2: {.   
3730: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
3740: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
3750: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
3760: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3770: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3780: 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76  fig.pcache2 = *v
3790: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37a0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
37b0: 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  2*);.      break
37c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
37d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
37e0: 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  ETPCACHE2: {.   
37f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3800: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3810: 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  e2.xInit==0 ){. 
3820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43         sqlite3PC
3830: 61 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29  acheSetDefault()
3840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3850: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3860: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
3870: 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ds2*) = sqlite3G
3880: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
3890: 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  he2;.      break
38a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
38b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
38c0: 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64  LE_MEMSYS3) || d
38d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
38e0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20  ABLE_MEMSYS5).  
38f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3900: 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20  NFIG_HEAP: {.   
3910: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
3920: 61 20 62 75 66 66 65 72 20 66 6f 72 20 68 65 61  a buffer for hea
3930: 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  p memory space *
3940: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3950: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
3960: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  p = va_arg(ap, v
3970: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3980: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3990: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
39a0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
39b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39c0: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61  fig.mnReq = va_a
39d0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20  rg(ap, int);..  
39e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
39f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3a00: 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  q<1 ){.        s
3a10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3a20: 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20  ig.mnReq = 1;.  
3a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
3a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3a50: 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20  g.mnReq>(1<<12) 
3a60: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61  ){.        /* ca
3a70: 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69  p min request si
3a80: 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20  ze at 2^12 */.  
3a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3aa0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
3ab0: 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20  = (1<<12);.     
3ac0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
3ad0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3ae0: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
3af0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
3b00: 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20  heap pointer is 
3b10: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f  NULL, then resto
3b20: 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d  re the malloc im
3b30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20  plementation.   
3b40: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
3b50: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f  NULL pointers to
3b60: 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  o.  This will ca
3b70: 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74  use the malloc t
3b80: 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  o go.        ** 
3b90: 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61  back to its defa
3ba0: 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ult implementati
3bb0: 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f  on when sqlite3_
3bc0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a  initialize() is.
3bd0: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a          ** run..
3be0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
3bf0: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
3c00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3c10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
3c20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c30: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
3c40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
3c50: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
3c60: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3c70: 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74  install one of t
3c80: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  he.        ** me
3c90: 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68  m5.c/mem3.c meth
3ca0: 6f 64 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73  ods.  The enclos
3cb0: 69 6e 67 20 23 69 66 20 67 75 61 72 61 6e 74 65  ing #if guarante
3cc0: 65 73 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a  es at.        **
3cd0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
3ce0: 65 73 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63  ese methods is c
3cf0: 75 72 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64  urrently enabled
3d00: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
3d10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3d20: 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20  E_MEMSYS3.      
3d30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3d40: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
3d50: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28  e3MemGetMemsys3(
3d60: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
3d70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
3d80: 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73  EMSYS5.        s
3d90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3da0: 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d  ig.m = *sqlite3M
3db0: 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a  emGetMemsys5();.
3dc0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
3dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3de0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61  }.#endif..    ca
3df0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3e00: 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20  _LOOKASIDE: {.  
3e10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3e20: 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
3e30: 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ide = va_arg(ap,
3e40: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3e50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3e60: 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61  .nLookaside = va
3e70: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3e80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3e90: 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65  }.    .    /* Re
3ea0: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
3eb0: 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e  o the logger fun
3ec0: 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69  ction and its fi
3ed0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
3ee0: 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
3ef0: 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69   is NULL.  Loggi
3f00: 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ng is disabled i
3f10: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  f the function p
3f20: 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a  ointer is.    **
3f30: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
3f40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3f50: 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20  NFIG_LOG: {.    
3f60: 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
3f70: 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
3f80: 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
3f90: 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
3fa0: 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
3fb0: 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
3fc0: 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
3fd0: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
3fe0: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
3ff0: 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28  arg(ap, void(*)(
4000: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
4010: 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a  char*));.      *
4020: 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
4030: 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29  void(*LOGFUNC_t)
4040: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
4050: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73   char*);.      s
4060: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4070: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
4080: 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b  (ap, LOGFUNC_t);
4090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
40a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41  obalConfig.pLogA
40b0: 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  rg = va_arg(ap, 
40c0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72  void*);.      br
40d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
40e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40f0: 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20  IG_URI: {.      
4100: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4110: 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76  fig.bOpenUri = v
4120: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4140: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4150: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
4160: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20  ING_INDEX_SCAN: 
4170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
4180: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
4190: 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Cis = va_arg(ap,
41a0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
41b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
41c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
41d0: 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20  SQLLOG.    case 
41e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
41f0: 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79  LLOG: {.      ty
4200: 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c  pedef void(*SQLL
4210: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
4220: 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
4230: 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20   char*, int);.  
4240: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4250: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
4260: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c  = va_arg(ap, SQL
4270: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
4280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4290: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
42a0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
42b0: 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  id *);.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
42d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
42e0: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
42f0: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ZE: {.      sqli
4300: 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
4310: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
4320: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
4330: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
4340: 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 mxMmap = va_ar
4350: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
4360: 74 36 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t64);.      if( 
4370: 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d  mxMmap<0 || mxMm
4380: 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  ap>SQLITE_MAX_MM
4390: 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  AP_SIZE ){.     
43a0: 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49     mxMmap = SQLI
43b0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
43c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
43d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
43e0: 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d  fig.mxMmap = mxM
43f0: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73  map;.      if( s
4400: 7a 4d 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70  zMmap<0 ) szMmap
4410: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
4420: 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20  T_MMAP_SIZE;.   
4430: 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78     if( szMmap>mx
4440: 4d 6d 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d  Mmap) szMmap = m
4450: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
4460: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4470: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
4480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4490: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
44a0: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t: {.      rc = 
44b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
44c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
44d0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
44e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
44f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
4500: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75  the lookaside bu
4510: 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61  ffers for a data
4520: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4530: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
4540: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
4550: 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69    .** If lookasi
4560: 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  de is already ac
4570: 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  tive, return SQL
4580: 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20  ITE_BUSY..**.** 
4590: 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72  The sz parameter
45a0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
45b0: 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20  f bytes in each 
45c0: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a  lookaside slot..
45d0: 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d  ** The cnt param
45e0: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
45f0: 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66  er of slots.  If
4600: 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20   pStart is NULL 
4610: 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72  the.** space for
4620: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
4630: 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65  emory is obtaine
4640: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
4650: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70  alloc()..** If p
4660: 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  Start is not NUL
4670: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a  L then it is sz*
4680: 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  cnt bytes of mem
4690: 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a  ory to use for.*
46a0: 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  * the lookaside 
46b0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
46c0: 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61  c int setupLooka
46d0: 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  side(sqlite3 *db
46e0: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
46f0: 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  t sz, int cnt){.
4700: 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a    void *pStart;.
4710: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
4720: 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  ide.nOut ){.    
4730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
4740: 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65  SY;.  }.  /* Fre
4750: 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c  e any existing l
4760: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 20  ookaside buffer 
4770: 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20  for this handle 
4780: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  before.  ** allo
4790: 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65  cating a new one
47a0: 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76   so we don't hav
47b0: 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65 20  e to have space 
47c0: 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61  for .  ** both a
47d0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
47e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
47f0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
4800: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
4810: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
4820: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
4830: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65   }.  /* The size
4840: 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   of a lookaside 
4850: 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44  slot after ROUND
4860: 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62  DOWN8 needs to b
4870: 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68  e larger.  ** th
4880: 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  an a pointer to 
4890: 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a  be useful..  */.
48a0: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e    sz = ROUNDDOWN
48b0: 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  8(sz);  /* IMP: 
48c0: 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f  R-33038-09382 */
48d0: 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29  .  if( sz<=(int)
48e0: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
48f0: 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b  Slot*) ) sz = 0;
4900: 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63  .  if( cnt<0 ) c
4910: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a  nt = 0;.  if( sz
4920: 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b  ==0 || cnt==0 ){
4930: 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20  .    sz = 0;.   
4940: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d   pStart = 0;.  }
4950: 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30  else if( pBuf==0
4960: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
4970: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
4980: 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d  ();.    pStart =
4990: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
49a0: 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d  sz*cnt );  /* IM
49b0: 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37  P: R-61949-35727
49c0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
49d0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
49e0: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
49f0: 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33   ) cnt = sqlite3
4a00: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72  MallocSize(pStar
4a10: 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)/sz;.  }else{.
4a20: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42 75      pStart = pBu
4a30: 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f  f;.  }.  db->loo
4a40: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20  kaside.pStart = 
4a50: 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f  pStart;.  db->lo
4a60: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
4a70: 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  0;.  db->lookasi
4a80: 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b  de.sz = (u16)sz;
4a90: 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b  .  if( pStart ){
4aa0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4ab0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70  LookasideSlot *p
4ac0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
4ad0: 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c   > (int)sizeof(L
4ae0: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
4af0: 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61  ;.    p = (Looka
4b00: 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74  sideSlot*)pStart
4b10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d  ;.    for(i=cnt-
4b20: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
4b30: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
4b40: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
4b50: 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c  ree;.      db->l
4b60: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
4b70: 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c   p;.      p = (L
4b80: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28  ookasideSlot*)&(
4b90: 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20  (u8*)p)[sz];.   
4ba0: 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61   }.    db->looka
4bb0: 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20  side.pEnd = p;. 
4bc0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4bd0: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20  .bEnabled = 1;. 
4be0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4bf0: 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75  .bMalloced = pBu
4c00: 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c  f==0 ?1:0;.  }el
4c10: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  se{.    db->look
4c20: 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a  aside.pEnd = 0;.
4c30: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4c40: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  e.bEnabled = 0;.
4c50: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4c60: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b  e.bMalloced = 0;
4c70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
4c80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4c90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74  * Return the mut
4ca0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
4cb0: 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
4cc0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c  nnection..*/.sql
4cd0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69  ite3_mutex *sqli
4ce0: 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c  te3_db_mutex(sql
4cf0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
4d00: 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d  urn db->mutex;.}
4d10: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20  ../*.** Free up 
4d20: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
4d30: 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68  s we can from th
4d40: 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
4d50: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
4d60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
4d70: 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
4d80: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4d90: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4da0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
4db0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
4dc0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
4dd0: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
4de0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
4df0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
4e00: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
4e10: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
4e20: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
4e30: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
4e40: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
4e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
4e60: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
4e70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
4e80: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
4e90: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
4ea0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4eb0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
4ec0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4ed0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
4ee0: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
4ef0: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
4f00: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4f10: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
4f20: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
4f30: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
4f40: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
4f50: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
4f60: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
4f70: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
4f80: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
4f90: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
4fa0: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
4fb0: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
4fc0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
4fd0: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
4fe0: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
4ff0: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
5000: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
5010: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
5020: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
5030: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
5040: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
5050: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
5060: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
5070: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
5080: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
5090: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
50a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
50b0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
50c0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
50d0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
50e0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
50f0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
5100: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
5110: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
5120: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
5130: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
5140: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
5150: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
5160: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
5170: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
5180: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
5190: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
51a0: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
51b0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
51c0: 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62  GER, SQLITE_Enab
51d0: 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20  leTrigger  },.  
51e0: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
51f0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
5200: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
5210: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
5220: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
5230: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5240: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
5250: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
5260: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
5270: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
5280: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
5290: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
52a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
52b0: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
52c0: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
52d0: 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73      int oldFlags
52e0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
52f0: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
5300: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
5310: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
5320: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
5330: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5340: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
5350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
5360: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
5370: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
5380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5390: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
53a0: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
53b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
53c0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
53d0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
53e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
53f0: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
5400: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
5410: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
5420: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
5430: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
5440: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
5450: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5480: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5490: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
54a0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
54b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
54c0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
54d0: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
54e0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
54f0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
5500: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
5510: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
5520: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
5530: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
5540: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
5550: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
5560: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
5570: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
5580: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
5590: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
55a0: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
55b0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
55c0: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
55d0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
55e0: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
55f0: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
5600: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
5610: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
5620: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
5630: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
5640: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
5650: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
5660: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
5670: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
5680: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
5690: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
56a0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
56b0: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
56c0: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
56d0: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20  1 : nKey2;.  rc 
56e0: 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20  = memcmp(pKey1, 
56f0: 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28  pKey2, n);.  if(
5700: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
5710: 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26  ( padFlag.     &
5720: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
5730: 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b  ar*)pKey1)+n, nK
5740: 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61  ey1-n).     && a
5750: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
5760: 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32  )pKey2)+n, nKey2
5770: 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  -n).    ){.     
5780: 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75 6e 63   /* Leave rc unc
5790: 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f 0a 20  hanged at 0 */. 
57a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
57b0: 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65  rc = nKey1 - nKe
57c0: 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  y2;.    }.  }.  
57d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
57e0: 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c  .** Another buil
57f0: 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73  t-in collating s
5800: 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e  equence: NOCASE.
5810: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c   .**.** This col
5820: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
5830: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
5840: 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65  e used for "case
5850: 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20   independent.** 
5860: 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c  comparison". SQL
5870: 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20  ite's knowledge 
5880: 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  of upper and low
5890: 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65  er case equivale
58a0: 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f  nts.** extends o
58b0: 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68  nly to the 26 ch
58c0: 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e  aracters used in
58d0: 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e   the English lan
58e0: 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20  guage..**.** At 
58f0: 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65  the moment there
5900: 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38   is only a UTF-8
5910: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
5920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
5930: 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
5940: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
5950: 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
5960: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
5970: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
5980: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
5990: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d  ey2.){.  int r =
59a0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
59b0: 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63  (.      (const c
59c0: 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f  har *)pKey1, (co
59d0: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32  nst char *)pKey2
59e0: 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f  , (nKey1<nKey2)?
59f0: 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20  nKey1:nKey2);.  
5a00: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5a10: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  (NotUsed);.  if(
5a20: 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d   0==r ){.    r =
5a30: 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20   nKey1-nKey2;.  
5a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
5a50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5a60: 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  e ROWID of the m
5a70: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
5a80: 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36  t.*/.sqlite_int6
5a90: 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  4 sqlite3_last_i
5aa0: 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69  nsert_rowid(sqli
5ab0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
5ac0: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
5ad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5ae0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5af0: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
5b00: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
5b10: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
5b20: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
5b30: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
5b40: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
5b50: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
5b60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5b70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
5b80: 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61  ges since the da
5b90: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
5ba0: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  s opened..*/.int
5bb0: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
5bc0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
5bd0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
5be0: 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a  ->nTotalChange;.
5bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
5c00: 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
5c10: 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
5c20: 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74  n only manipulat
5c30: 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  es fields of the
5c40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
5c50: 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64  dle object, it d
5c60: 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e  oes not close an
5c70: 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
5c80: 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a  t may be open.**
5c90: 20 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70   at the b-tree/p
5ca0: 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76  ager level..*/.v
5cb0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  oid sqlite3Close
5cc0: 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74  Savepoints(sqlit
5cd0: 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65  e3 *db){.  while
5ce0: 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  ( db->pSavepoint
5cf0: 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e   ){.    Savepoin
5d00: 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53  t *pTmp = db->pS
5d10: 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62  avepoint;.    db
5d20: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
5d30: 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Tmp->pNext;.    
5d40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5d50: 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64  , pTmp);.  }.  d
5d60: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->nSavepoint = 
5d70: 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0;.  db->nStatem
5d80: 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69  ent = 0;.  db->i
5d90: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
5da0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  point = 0;.}../*
5db0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64  .** Invoke the d
5dc0: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
5dd0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
5de0: 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66  th FuncDef p, if
5df0: 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a   any. Except,.**
5e00: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
5e10: 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66  the last copy of
5e20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64   the function, d
5e30: 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e  o not invoke it.
5e40: 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70   Multiple.** cop
5e50: 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ies of a single 
5e60: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65  function are cre
5e70: 61 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65  ated when create
5e80: 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63  _function() is c
5e90: 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51  alled.** with SQ
5ea0: 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20  LITE_ANY as the 
5eb0: 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61  encoding..*/.sta
5ec0: 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f  tic void functio
5ed0: 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33  nDestroy(sqlite3
5ee0: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
5ef0: 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  ){.  FuncDestruc
5f00: 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72  tor *pDestructor
5f10: 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f   = p->pDestructo
5f20: 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75  r;.  if( pDestru
5f30: 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73  ctor ){.    pDes
5f40: 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b  tructor->nRef--;
5f50: 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75  .    if( pDestru
5f60: 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ctor->nRef==0 ){
5f70: 0a 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74  .      pDestruct
5f80: 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65  or->xDestroy(pDe
5f90: 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44  structor->pUserD
5fa0: 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
5fb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
5fc0: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
5fd0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
5fe0: 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71  isconnect all sq
5ff0: 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63  lite3_vtab objec
6000: 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
6010: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  o database conne
6020: 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69  ction.** db. Thi
6030: 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  s is called when
6040: 20 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f   db is being clo
6050: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
6060: 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  oid disconnectAl
6070: 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64  lVtab(sqlite3 *d
6080: 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b){.#ifndef SQLI
6090: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
60a0: 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ABLE.  int i;.  
60b0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
60c0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
60d0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
60e0: 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61  i++){.    Schema
60f0: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
6100: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[i].pSchema;.
6110: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
6120: 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  i].pSchema ){.  
6130: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
6140: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
6150: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
6160: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
6170: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
6180: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
6190: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
61a0: 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48  (Table *)sqliteH
61b0: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
61c0: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
61d0: 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65  l(pTab) ) sqlite
61e0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
61f0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
6200: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
6210: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6220: 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20  All(db);.#else. 
6230: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
6240: 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  R(db);.#endif.}.
6250: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
6260: 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20 63  UE if database c
6270: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73  onnection db has
6280: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
6290: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
62a0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
62b0: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
62c0: 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73   objects.  .*/.s
62d0: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63  tatic int connec
62e0: 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74  tionIsBusy(sqlit
62f0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a  e3 *db){.  int j
6300: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6310: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
6320: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
6330: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72  f( db->pVdbe ) r
6340: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a  eturn 1;.  for(j
6350: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
6360: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
6370: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
6380: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6390: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
63a0: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
63b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
63c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
63d0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
63e0: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
63f0: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
6400: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f  c int sqlite3Clo
6410: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  se(sqlite3 *db, 
6420: 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29  int forceZombie)
6430: 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  {.  if( !db ){. 
6440: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6450: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
6460: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6470: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
6480: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6490: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
64a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
64b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
64c0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72  utex);..  /* For
64d0: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
64e0: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
64f0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
6500: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
6510: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
6520: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
6530: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
6540: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
6550: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
6560: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
6570: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
6580: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
6590: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
65a0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
65b0: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
65c0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
65d0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
65e0: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
65f0: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
6600: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
6610: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
6620: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
6630: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
6640: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
6650: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
6660: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
6670: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
6680: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6690: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
66a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
66b0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
66c0: 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61    /* Legacy beha
66d0: 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c  vior (sqlite3_cl
66e0: 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20  ose() behavior) 
66f0: 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  is to return.  *
6700: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  * SQLITE_BUSY if
6710: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6720: 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  can not be close
6730: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
6740: 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65   */.  if( !force
6750: 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63  Zombie && connec
6760: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
6770: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6780: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
6790: 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63  SY, "unable to c
67a0: 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69  lose due to unfi
67b0: 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20  nalized ".      
67c0: 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20   "statements or 
67d0: 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75  unfinished backu
67e0: 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ps");.    sqlite
67f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6800: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
6810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
6820: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
6830: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
6840: 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  OG.  if( sqlite3
6850: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
6860: 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43  llog ){.    /* C
6870: 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c  losing the handl
6880: 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
6890: 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68  ter is passed th
68a0: 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20  e value 2. */.  
68b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
68c0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71  onfig.xSqllog(sq
68d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
68e0: 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62  g.pSqllogArg, db
68f0: 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 2);.  }.#en
6900: 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72  dif..  /* Conver
6910: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
6920: 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61   into a zombie a
6930: 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74  nd then close it
6940: 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67  ..  */.  db->mag
6950: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
6960: 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69  C_ZOMBIE;.  sqli
6970: 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64  te3LeaveMutexAnd
6980: 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b  CloseZombie(db);
6990: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
69a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  _OK;.}../*.** Tw
69b0: 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20  o variations on 
69c0: 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72  the public inter
69d0: 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  face for closing
69e0: 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
69f0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73  onnection. The s
6a00: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76  qlite3_close() v
6a10: 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  ersion returns S
6a20: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a  QLITE_BUSY and.*
6a30: 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e  * leaves the con
6a40: 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69  nection option i
6a50: 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66 69  f there are unfi
6a60: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
6a70: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
6a80: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
6a90: 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54  ite3_backups.  T
6aa0: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
6ab0: 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e  _v2().** version
6ac0: 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e   forces the conn
6ad0: 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65  ection to become
6ae0: 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65   a zombie if the
6af0: 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73  re are.** unclos
6b00: 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e  ed resources, an
6b10: 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64  d arranges for d
6b20: 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e  eallocation when
6b30: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65   the last.** pre
6b40: 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f  pare statement o
6b50: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
6b60: 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20   closes..*/.int 
6b70: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71  sqlite3_close(sq
6b80: 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75  lite3 *db){ retu
6b90: 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28  rn sqlite3Close(
6ba0: 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c  db,0); }.int sql
6bb0: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71  ite3_close_v2(sq
6bc0: 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75  lite3 *db){ retu
6bd0: 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28  rn sqlite3Close(
6be0: 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a  db,1); }.../*.**
6bf0: 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   Close the mutex
6c00: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e   on database con
6c10: 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a  nection db..**.*
6c20: 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69  * Furthermore, i
6c30: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
6c40: 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f  ction db is a zo
6c50: 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  mbie (meaning th
6c60: 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20  at there.** has 
6c70: 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c  been a prior cal
6c80: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  l to sqlite3_clo
6c90: 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65  se(db) or sqlite
6ca0: 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20  3_close_v2(db)) 
6cb0: 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c  and.** every sql
6cc0: 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f  ite3_stmt has no
6cd0: 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  w been finalized
6ce0: 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74   and every sqlit
6cf0: 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a  e3_backup has.**
6d00: 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20   finished, then 
6d10: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
6d20: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
6d30: 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64  te3LeaveMutexAnd
6d40: 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69  CloseZombie(sqli
6d50: 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68  te3 *db){.  Hash
6d60: 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20  Elem *i;        
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
6d80: 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74  ash table iterat
6d90: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a  or */.  int j;..
6da0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
6db0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71  e outstanding sq
6dc0: 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71  lite3_stmt or sq
6dd0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
6de0: 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20  ects.  ** or if 
6df0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  the connection h
6e00: 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
6e10: 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65  closed by sqlite
6e20: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20  3_close_v2(),.  
6e30: 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61  ** then just lea
6e40: 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  ve the mutex and
6e50: 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
6e60: 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53  if( db->magic!=S
6e70: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42  QLITE_MAGIC_ZOMB
6e80: 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e  IE || connection
6e90: 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20  IsBusy(db) ){.  
6ea0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6eb0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6ec0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
6ed0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
6ee0: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
6ef0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
6f00: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
6f10: 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63  ction has.  ** c
6f20: 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65  losed all sqlite
6f30: 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74  3_stmt and sqlit
6f40: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6f50: 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20  s and has been. 
6f60: 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71   ** passed to sq
6f70: 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61  lite3_close (mea
6f80: 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  ning that it is 
6f90: 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72  a zombie).  Ther
6fa0: 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61  efore,.  ** go a
6fb0: 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c  head and free al
6fc0: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a  l resources..  *
6fd0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  /..  /* If a tra
6fe0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
6ff0: 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  , roll it back. 
7000: 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65  This also ensure
7010: 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61  s that if.  ** a
7020: 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ny database sche
7030: 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  mas have been mo
7040: 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63  dified by an unc
7050: 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
7060: 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61  tion.  ** they a
7070: 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68  re reset. And th
7080: 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64 20  at the required 
7090: 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
70a0: 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a  held to make.  *
70b0: 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c  * the pager roll
70c0: 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20  back and schema 
70d0: 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20  reset an atomic 
70e0: 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  operation. */.  
70f0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
7100: 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
7110: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e  );..  /* Free an
7120: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61  y outstanding Sa
7130: 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
7140: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
7150: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
7160: 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  db);..  /* Close
7170: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
7180: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66  nnections */.  f
7190: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
71a0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; j++){.    str
71b0: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
71c0: 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69  b->aDb[j];.    i
71d0: 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20  f( pDb->pBt ){. 
71e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
71f0: 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29  eClose(pDb->pBt)
7200: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74  ;.      pDb->pBt
7210: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
7220: 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j!=1 ){.        
7230: 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30  pDb->pSchema = 0
7240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7250: 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74    }.  /* Clear t
7260: 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73  he TEMP schema s
7270: 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61  eparately and la
7280: 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  st */.  if( db->
7290: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
72a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68  {.    sqlite3Sch
72b0: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
72c0: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
72d0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  }.  sqlite3VtabU
72e0: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a  nlockList(db);..
72f0: 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65    /* Free up the
7300: 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69   array of auxili
7310: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ary databases */
7320: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  .  sqlite3Collap
7330: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
7340: 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
7350: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
7360: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
7370: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
7380: 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20  ..  /* Tell the 
7390: 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63  code in notify.c
73a0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
73b0: 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68  tion no longer h
73c0: 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f  olds any.  ** lo
73d0: 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  cks and does not
73e0: 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72   require any fur
73f0: 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ther unlock-noti
7400: 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
7410: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  */.  sqlite3Conn
7420: 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29  ectionClosed(db)
7430: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  ;..  for(j=0; j<
7440: 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46  ArraySize(db->aF
7450: 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20  unc.a); j++){.  
7460: 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74    FuncDef *pNext
7470: 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20  , *pHash, *p;.  
7480: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e    for(p=db->aFun
7490: 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61  c.a[j]; p; p=pHa
74a0: 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68  sh){.      pHash
74b0: 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20   = p->pHash;.   
74c0: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
74d0: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44         functionD
74e0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20  estroy(db, p);. 
74f0: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
7500: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
7510: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7520: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
7530: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
7540: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
7550: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
7560: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
7570: 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  q); i; i=sqliteH
7580: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
7590: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
75a0: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
75b0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
75c0: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e      /* Invoke an
75d0: 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65  y destructors re
75e0: 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c  gistered for col
75f0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
7600: 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20  user data. */.  
7610: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
7620: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
7630: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b  pColl[j].xDel ){
7640: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a  .        pColl[j
7650: 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e  ].xDel(pColl[j].
7660: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pUser);.      }.
7670: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7680: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
7690: 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
76a0: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
76b0: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
76c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
76d0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
76e0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
76f0: 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  rst(&db->aModule
7700: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
7710: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
7720: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
7730: 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48  Module *)sqliteH
7740: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
7750: 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72  if( pMod->xDestr
7760: 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64  oy ){.      pMod
7770: 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d  ->xDestroy(pMod-
7780: 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >pAux);.    }.  
7790: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
77a0: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20  db, pMod);.  }. 
77b0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
77c0: 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  r(&db->aModule);
77d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
77e0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
77f0: 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65  TE_OK, 0); /* De
7800: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61  allocates any ca
7810: 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e  ched error strin
7820: 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  gs. */.  if( db-
7830: 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >pErr ){.    sql
7840: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
7850: 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  ->pErr);.  }.  s
7860: 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e  qlite3CloseExten
7870: 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62  sions(db);..  db
7880: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7890: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
78a0: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
78b0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
78c0: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
78d0: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
78e0: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
78f0: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
7900: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
7910: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
7920: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
7930: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
7940: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
7950: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
7960: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
7970: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
7980: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
7990: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
79a0: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
79b0: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
79c0: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
79d0: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
79e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
79f0: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
7a00: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
7a10: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7a20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
7a30: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
7a40: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
7a50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
7a60: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
7a70: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
7a80: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
7a90: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
7aa0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
7ab0: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
7ac0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
7ad0: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
7ae0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
7af0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
7b00: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
7b10: 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  _free(db);.}../*
7b20: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
7b30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
7b40: 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73    If tripCode is
7b50: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20   not SQLITE_OK, 
7b60: 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e  then.** any open
7b70: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76   cursors are inv
7b80: 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70 70  alidated ("tripp
7b90: 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69  ed" - as in "tri
7ba0: 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a  pping a circuit.
7bb0: 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64  ** breaker") and
7bc0: 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20   made to return 
7bd0: 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65 72  tripCode if ther
7be0: 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68 65  e are any furthe
7bf0: 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  r.** attempts to
7c00: 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f 72   use that cursor
7c10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7c20: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c  3RollbackAll(sql
7c30: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72  ite3 *db, int tr
7c40: 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69  ipCode){.  int i
7c50: 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20  ;.  int inTrans 
7c60: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
7c70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7c80: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
7c90: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
7ca0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
7cb0: 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62   /* Obtain all b
7cc0: 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65  -tree mutexes be
7cd0: 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20  fore making any 
7ce0: 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f  calls to BtreeRo
7cf0: 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20  llback(). .  ** 
7d00: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
7d10: 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72  t in case the tr
7d20: 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20  ansaction being 
7d30: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a  rolled back has.
7d40: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68    ** modified th
7d50: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
7d60: 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  a. If the b-tree
7d70: 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74   mutexes are not
7d80: 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65   taken.  ** here
7d90: 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73  , then another s
7da0: 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e  hared-cache conn
7db0: 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65  ection might sne
7dc0: 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20  ak in between.  
7dd0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
7de0: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
7df0: 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68  ema reset, which
7e00: 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65   can cause false
7e10: 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  .  ** corruption
7e20: 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65   reports in some
7e30: 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71   cases.  */.  sq
7e40: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
7e50: 6c 6c 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69  ll(db);..  for(i
7e60: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
7e70: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
7e80: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
7e90: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  Bt;.    if( p ){
7ea0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
7eb0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
7ec0: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  (p) ){.        i
7ed0: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
7ee0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7ef0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
7f00: 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 20  , tripCode);.   
7f10: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
7f20: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
7f30: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
7f40: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
7f50: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26   if( (db->flags&
7f60: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
7f70: 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e  nges)!=0 && db->
7f80: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
7f90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
7fa0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
7fb0: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  nts(db);.    sql
7fc0: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
7fd0: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
7fe0: 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
7ff0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
8000: 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64  db);..  /* Any d
8010: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
8020: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61  nt violations ha
8030: 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f  ve now been reso
8040: 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e  lved. */.  db->n
8050: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
8060: 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  ;.  db->nDeferre
8070: 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
8080: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
8090: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a  LITE_DeferFKs;..
80a0: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20    /* If one has 
80b0: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
80c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c   invoke the roll
80d0: 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61  back-hook callba
80e0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ck */.  if( db->
80f0: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
8100: 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c  k && (inTrans ||
8110: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
8120: 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f  ) ){.    db->xRo
8130: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64  llbackCallback(d
8140: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29  b->pRollbackArg)
8150: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8160: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
8170: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
8180: 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73   the name corres
8190: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65  ponding to the e
81a0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65  rror code.** spe
81b0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72  cified in the ar
81c0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64  gument..*/.#if d
81d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
81e0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
81f0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
8200: 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53 51  \.    defined(SQ
8210: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
8220: 41 43 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  ACE).const char 
8230: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
8240: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
8250: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
8260: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
8270: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
8280: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
8290: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
82a0: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
82b0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
82c0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
82e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
82f0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
8300: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8310: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
8320: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
8330: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
8340: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
8350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8360: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
8370: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
8380: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8390: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
83a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
83b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
83c0: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
83d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
83e0: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
83f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8400: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
8410: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
8420: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8430: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
8440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8450: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
8460: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
8470: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8480: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
8490: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
84a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
84b0: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
84c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
84d0: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
84e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
84f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8500: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
8510: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8520: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
8530: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
8540: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8550: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
8560: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8570: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
8580: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
8590: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
85a0: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
85b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
85c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
85d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
85e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
85f0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
8600: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
8610: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
8620: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
8630: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8640: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
8650: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8660: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8680: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8690: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
86a0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
86b0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
86c0: 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  LY";          br
86d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
86e0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
86f0: 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65  RECOVERY:  zName
8700: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
8710: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62  NLY_RECOVERY"; b
8720: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8730: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
8740: 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d  _CANTLOCK:  zNam
8750: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
8760: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
8770: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8780: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
8790: 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61  Y_ROLLBACK:  zNa
87a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
87b0: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b  DONLY_ROLLBACK";
87c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
87d0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  se SQLITE_INTERR
87e0: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  UPT:          zN
87f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
8800: 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  TERRUPT";       
8810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8820: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8830: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
8840: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8850: 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20  OERR";          
8860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8870: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8880: 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20  R_READ:         
8890: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
88a0: 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20  IOERR_READ";    
88b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
88c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
88d0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20  RR_SHORT_READ:  
88e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
88f0: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
8900: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
8910: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8920: 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20  ERR_WRITE:      
8930: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8940: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20  E_IOERR_WRITE"; 
8950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8960: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8970: 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20  OERR_FSYNC:     
8980: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8990: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b  TE_IOERR_FSYNC";
89a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
89b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
89c0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a  IOERR_DIR_FSYNC:
89d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
89e0: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
89f0: 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  YNC";   break;. 
8a00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8a10: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a  _IOERR_TRUNCATE:
8a20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8a30: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
8a40: 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATE";    break;.
8a50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8a60: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20  E_IOERR_FSTAT:  
8a70: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8a80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
8a90: 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  T";       break;
8aa0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8ab0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a  TE_IOERR_UNLOCK:
8ac0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8ad0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
8ae0: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
8af0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8b00: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
8b10: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
8b20: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44  "SQLITE_IOERR_RD
8b30: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
8b40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8b50: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
8b60: 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  E:       zName =
8b70: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
8b80: 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65  ELETE";      bre
8b90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8ba0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
8bb0: 4b 45 44 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  KED:      zName 
8bc0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8bd0: 42 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 62 72  BLOCKED";     br
8be0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8bf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
8c00: 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  EM:        zName
8c10: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8c20: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62  _NOMEM";       b
8c30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8c40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
8c50: 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d  CESS:       zNam
8c60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8c70: 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20  R_ACCESS";      
8c80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8c90: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
8ca0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
8cb0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8ce0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
8cf0: 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61  ERVEDLOCK"; brea
8d00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8d10: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a  LITE_IOERR_LOCK:
8d20: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8d30: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c   "SQLITE_IOERR_L
8d40: 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  OCK";        bre
8d50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8d60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
8d70: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
8d80: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8d90: 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72  CLOSE";       br
8da0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8db0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
8dc0: 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65  _CLOSE:    zName
8dd0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8de0: 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62  _DIR_CLOSE";   b
8df0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8e00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
8e10: 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d  MOPEN:      zNam
8e20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8e30: 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20  R_SHMOPEN";     
8e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8e50: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8e60: 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61  HMSIZE:      zNa
8e70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8e80: 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20  RR_SHMSIZE";    
8e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8ea0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8eb0: 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e  SHMLOCK:      zN
8ec0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8ed0: 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20  ERR_SHMLOCK";   
8ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8ef0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8f00: 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a  _SHMMAP:       z
8f10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8f20: 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20  OERR_SHMMAP";   
8f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f40: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8f50: 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20  R_SEEK:         
8f60: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8f70: 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20  IOERR_SEEK";    
8f80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8f90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8fa0: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a  RR_DELETE_NOENT:
8fb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8fc0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
8fd0: 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ENT";break;.    
8fe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8ff0: 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20  ERR_MMAP:       
9000: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9010: 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20  E_IOERR_MMAP";  
9020: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9030: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
9040: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
9050: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
9060: 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
9070: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
9080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9090: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20  IOERR_CONVPATH: 
90a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
90b0: 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
90c0: 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TH";    break;. 
90d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
90e0: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20  _CORRUPT:       
90f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9100: 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20  LITE_CORRUPT";  
9110: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9120: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9130: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20  E_CORRUPT_VTAB: 
9140: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9150: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
9160: 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AB";      break;
9170: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9180: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20  TE_NOTFOUND:    
9190: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
91a0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22  SQLITE_NOTFOUND"
91b0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
91c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
91d0: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
91e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
91f0: 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20  "SQLITE_FULL";  
9200: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9210: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9220: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
9230: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9240: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
9250: 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  N";          bre
9260: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9270: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
9280: 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20  OTEMPDIR: zName 
9290: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
92a0: 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72  EN_NOTEMPDIR";br
92b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
92c0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
92d0: 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65  ISDIR:     zName
92e0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
92f0: 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62  PEN_ISDIR";    b
9300: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9310: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9320: 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d  _FULLPATH:  zNam
9330: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
9340: 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20  OPEN_FULLPATH"; 
9350: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9360: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
9370: 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61  N_CONVPATH:  zNa
9380: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
9390: 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b  TOPEN_CONVPATH";
93a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
93b0: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
93c0: 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  OL:           zN
93d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52  ame = "SQLITE_PR
93e0: 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20  OTOCOL";        
93f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9400: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
9410: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
9420: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
9430: 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20  MPTY";          
9440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9450: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
9460: 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  MA:             
9470: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9480: 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20  SCHEMA";        
9490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
94a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
94b0: 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  BIG:            
94c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
94d0: 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20  _TOOBIG";       
94e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
9500: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
9510: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9520: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20  E_CONSTRAINT";  
9530: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9550: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
9560: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
9570: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
9580: 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  IQUE"; break;.  
9590: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
95a0: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
95b0: 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  ER: zName = "SQL
95c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
95d0: 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20  RIGGER";break;. 
95e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
95f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
9600: 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  IGNKEY:.        
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9630: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
9640: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20  NT_FOREIGNKEY"; 
9650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9660: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9670: 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a  RAINT_CHECK:   z
9680: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9690: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22  ONSTRAINT_CHECK"
96a0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
96b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
96c0: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
96d0: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9700: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
9710: 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65  IMARYKEY";   bre
9720: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9730: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9740: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20  _NOTNULL: zName 
9750: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9760: 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72  AINT_NOTNULL";br
9770: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9780: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9790: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20  T_COMMITHOOK:.  
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
97c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
97d0: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
97e0: 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OOK";   break;. 
97f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9800: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
9810: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
9820: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9830: 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a  VTAB";   break;.
9840: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9850: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
9860: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20  CTION:.         
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9890: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
98a0: 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20  T_FUNCTION";    
98b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
98c0: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
98d0: 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  CH:           zN
98e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
98f0: 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20  SMATCH";        
9900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9910: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
9920: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
9930: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
9940: 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20  ISUSE";         
9950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9960: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
9970: 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S:              
9980: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9990: 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20  NOLFS";         
99a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
99b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54   case SQLITE_AUT
99c0: 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H:              
99d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
99e0: 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 20  _AUTH";         
99f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
9a10: 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20  RMAT:           
9a20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9a30: 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20  E_FORMAT";      
9a40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9a50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
9a60: 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20  ANGE:           
9a70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9a80: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
9a90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9aa0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9ab0: 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20 20  NOTADB:         
9ac0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9ad0: 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20  ITE_NOTADB";    
9ae0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9af0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9b00: 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20  _ROW:           
9b10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9b20: 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20  LITE_ROW";      
9b30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9b40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9b50: 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20  E_NOTICE:       
9b60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9b70: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20  QLITE_NOTICE";  
9b80: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9b90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9ba0: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
9bb0: 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22  R_WAL: zName = "
9bc0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9bd0: 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b  COVER_WAL";break
9be0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9bf0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
9c00: 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20  ER_ROLLBACK:.   
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9c30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
9c40: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
9c50: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
9c60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9c70: 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20  WARNING:        
9c80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9c90: 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20  ITE_WARNING";   
9ca0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9cb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9cc0: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
9cd0: 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  EX:  zName = "SQ
9ce0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
9cf0: 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  OINDEX"; break;.
9d00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9d10: 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  E_DONE:         
9d20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9d30: 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20  QLITE_DONE";    
9d40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
9d60: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
9d70: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75   static char zBu
9d80: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  f[50];.    sqlit
9d90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
9da0: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
9db0: 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28  "SQLITE_UNKNOWN(
9dc0: 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20  %d)", origRc);. 
9dd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b     zName = zBuf;
9de0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
9df0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
9e00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
9e10: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
9e20: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
9e30: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
9e40: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
9e50: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
9e60: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
9e70: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
9e80: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
9e90: 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67  char* const aMsg
9ea0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51  [] = {.    /* SQ
9eb0: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
9ec0: 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f   */ "not an erro
9ed0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
9ee0: 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f  E_ERROR       */
9ef0: 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   "SQL logic erro
9f00: 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74  r or missing dat
9f10: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
9f20: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20  QLITE_INTERNAL  
9f30: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
9f40: 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20  QLITE_PERM      
9f50: 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72    */ "access per
9f60: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c  mission denied",
9f70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
9f80: 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63  BORT       */ "c
9f90: 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65  allback requeste
9fa0: 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a  d query abort",.
9fb0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55      /* SQLITE_BU
9fc0: 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  SY        */ "da
9fd0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
9fe0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
9ff0: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20  _LOCKED      */ 
a000: 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
a010: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
a020: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  /* SQLITE_NOMEM 
a030: 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66        */ "out of
a040: 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a   memory",.    /*
a050: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a060: 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20      */ "attempt 
a070: 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f  to write a reado
a080: 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20  nly database",. 
a090: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
a0a0: 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74  ERRUPT   */ "int
a0b0: 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f  errupted",.    /
a0c0: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20  * SQLITE_IOERR  
a0d0: 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f       */ "disk I/
a0e0: 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  O error",.    /*
a0f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
a100: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
a110: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
a120: 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f  alformed",.    /
a130: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  * SQLITE_NOTFOUN
a140: 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e  D    */ "unknown
a150: 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20   operation",.   
a160: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   /* SQLITE_FULL 
a170: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
a180: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
a190: 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ull",.    /* SQL
a1a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20  ITE_CANTOPEN    
a1b0: 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  */ "unable to op
a1c0: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
a1d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a1e0: 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20  _PROTOCOL    */ 
a1f0: 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f  "locking protoco
a200: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
a210: 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f  E_EMPTY       */
a220: 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73   "table contains
a230: 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f   no data",.    /
a240: 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  * SQLITE_SCHEMA 
a250: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
a260: 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61  e schema has cha
a270: 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nged",.    /* SQ
a280: 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20  LITE_TOOBIG     
a290: 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62   */ "string or b
a2a0: 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20  lob too big",.  
a2b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53    /* SQLITE_CONS
a2c0: 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73  TRAINT  */ "cons
a2d0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a  traint failed",.
a2e0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
a2f0: 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61  SMATCH    */ "da
a300: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22  tatype mismatch"
a310: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a320: 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22  MISUSE      */ "
a330: 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20  library routine 
a340: 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65  called out of se
a350: 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20  quence",.    /* 
a360: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20  SQLITE_NOLFS    
a370: 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c     */ "large fil
a380: 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73  e support is dis
a390: 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  abled",.    /* S
a3a0: 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20  QLITE_AUTH      
a3b0: 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74    */ "authorizat
a3c0: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
a3d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41   /* SQLITE_FORMA
a3e0: 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c  T      */ "auxil
a3f0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f  iary database fo
a400: 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20  rmat error",.   
a410: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45   /* SQLITE_RANGE
a420: 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20         */ "bind 
a430: 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  or column index 
a440: 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20  out of range",. 
a450: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
a460: 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c  ADB      */ "fil
a470: 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f  e is encrypted o
a480: 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  r is not a datab
a490: 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e  ase",.  };.  con
a4a0: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
a4b0: 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b  "unknown error";
a4c0: 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b  .  switch( rc ){
a4d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
a4e0: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a  _ABORT_ROLLBACK:
a4f0: 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20   {.      zErr = 
a500: 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f  "abort due to RO
a510: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62  LLBACK";.      b
a520: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a530: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
a540: 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 20   rc &= 0xff;.   
a550: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63     if( ALWAYS(rc
a560: 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61 79  >=0) && rc<Array
a570: 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61 4d  Size(aMsg) && aM
a580: 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20  sg[rc]!=0 ){.   
a590: 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73 67       zErr = aMsg
a5a0: 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [rc];.      }.  
a5b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a5c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45  .  }.  return zE
a5d0: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rr;.}../*.** Thi
a5e0: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
a5f0: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
a600: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
a610: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
a620: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
a630: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
a640: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
a650: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
a660: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
a670: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
a680: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
a690: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
a6a0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
a6b0: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
a6c0: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76  BusyCallback(. v
a6d0: 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20  oid *ptr,       
a6e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a6f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a700: 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20  /. int count    
a710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a720: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
a730: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75  able has been bu
a740: 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c  sy */.){.#if SQL
a750: 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64  ITE_OS_WIN || (d
a760: 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
a770: 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
a780: 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EP).  static con
a790: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
a7a0: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
a7b0: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
a7c0: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
a7d0: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
a7e0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
a7f0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
a800: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
a810: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
a820: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
a830: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
a840: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
a850: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
a860: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
a870: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
a880: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
a890: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
a8a0: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
a8b0: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
a8c0: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
a8d0: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
a8e0: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
a8f0: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
a900: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
a910: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
a920: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
a930: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
a940: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
a950: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
a960: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
a970: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
a980: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
a990: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
a9a0: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
a9b0: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
a9c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
a9d0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
a9e0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
a9f0: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
aa00: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
aa10: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
aa20: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
aa30: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
aa40: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
aa50: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
aa60: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
aa70: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
aa80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
aa90: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
aaa0: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
aab0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
aac0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
aad0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
aae0: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
aaf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ab00: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
ab10: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
ab20: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
ab30: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
ab40: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
ab50: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
ab60: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
ab70: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
ab80: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
ab90: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
aba0: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
abb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
abc0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
abd0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
abe0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
abf0: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20   NEVER(p==0) || 
ac00: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70  p->xFunc==0 || p
ac10: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
ac20: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  rn 0;.  rc = p->
ac30: 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70  xFunc(p->pArg, p
ac40: 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20  ->nBusy);.  if( 
ac50: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  rc==0 ){.    p->
ac60: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
ac70: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
ac80: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
ac90: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
aca0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
acb0: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
acc0: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
acd0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
ace0: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
acf0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
ad00: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
ad10: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
ad20: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
ad30: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
ad40: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
ad50: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
ad60: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
ad70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ad80: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ad90: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
ada0: 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a  .xFunc = xBusy;.
adb0: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
adc0: 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  r.pArg = pArg;. 
add0: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
ade0: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
adf0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
ae00: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
ae10: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
ae20: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
ae30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
ae40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ae50: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
ae60: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
ae70: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
ae80: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
ae90: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
aea0: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
aeb0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
aec0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
aed0: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
aee0: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
aef0: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
af00: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
af10: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
af20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
af30: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
af40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
af50: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
af60: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
af70: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
af80: 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74  *pArg.){.  sqlit
af90: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
afa0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
afb0: 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64   nOps>0 ){.    d
afc0: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78  b->xProgress = x
afd0: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62  Progress;.    db
afe0: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
aff0: 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b   (unsigned)nOps;
b000: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
b010: 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ssArg = pArg;.  
b020: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78  }else{.    db->x
b030: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
b040: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
b050: 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ps = 0;.    db->
b060: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30  pProgressArg = 0
b070: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
b080: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
b090: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
b0a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
b0b0: 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61  utine installs a
b0c0: 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61   default busy ha
b0d0: 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73  ndler that waits
b0e0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63   for the.** spec
b0f0: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
b100: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
b110: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e  ore returning 0.
b120: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
b130: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c  busy_timeout(sql
b140: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73  ite3 *db, int ms
b150: 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  ){.  if( ms>0 ){
b160: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
b170: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
b180: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
b190: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
b1a0: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73  db);.    db->bus
b1b0: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
b1c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
b1d0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
b1e0: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
b1f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b200: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
b210: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
b220: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
b230: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
b240: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
b250: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
b260: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
b270: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69  *db){.  db->u1.i
b280: 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31  sInterrupted = 1
b290: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
b2a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61   function is exa
b2b0: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73  ctly the same as
b2c0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
b2d0: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65  function(), exce
b2e0: 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  pt.** that it is
b2f0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20   designed to be 
b300: 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e  called by intern
b310: 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66  al code. The dif
b320: 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68  ference is.** th
b330: 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  at if a malloc()
b340: 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65   fails in sqlite
b350: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
b360: 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  n(), an error co
b370: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
b380: 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63  d and the malloc
b390: 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61  Failed flag clea
b3a0: 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  red. .*/.int sql
b3b0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a  ite3CreateFunc(.
b3c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
b3d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
b3e0: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
b3f0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
b400: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  c,.  void *pUser
b410: 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Data,.  void (*x
b420: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
b430: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
b440: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
b450: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
b460: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
b470: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
b480: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
b490: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
b4a0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63  ontext*),.  Func
b4b0: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
b4c0: 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e  tructor.){.  Fun
b4d0: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
b4e0: 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Name;..  assert(
b4f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b500: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
b510: 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f  ;.  if( zFunctio
b520: 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20  nName==0 ||.    
b530: 20 20 28 78 46 75 6e 63 20 26 26 20 28 78 46 69    (xFunc && (xFi
b540: 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c  nal || xStep)) |
b550: 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  | .      (!xFunc
b560: 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21   && (xFinal && !
b570: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
b580: 20 28 21 78 46 75 6e 63 20 26 26 20 28 21 78 46   (!xFunc && (!xF
b590: 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20  inal && xStep)) 
b5a0: 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d  ||.      (nArg<-
b5b0: 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45  1 || nArg>SQLITE
b5c0: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
b5d0: 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35  G) ||.      (255
b5e0: 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  <(nName = sqlite
b5f0: 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63  3Strlen30( zFunc
b600: 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20  tionName))) ){. 
b610: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b620: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
b630: 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.  .#ifndef SQL
b640: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
b650: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
b660: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
b670: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
b680: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
b690: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
b6a0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
b6b0: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
b6c0: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
b6d0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
b6e0: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
b6f0: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
b700: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
b710: 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ly..  **.  ** If
b720: 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73   SQLITE_ANY is s
b730: 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68  pecified, add th
b740: 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
b750: 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  the function.  *
b760: 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  * to the hash ta
b770: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
b780: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
b790: 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53  6 ){.    enc = S
b7a0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
b7b0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  E;.  }else if( e
b7c0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29  nc==SQLITE_ANY )
b7d0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
b7e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
b7f0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
b800: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
b810: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
b820: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
b830: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
b840: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
b850: 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ctor);.    if( r
b860: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b870: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b880: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
b890: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
b8a0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
b8b0: 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  16LE,.          
b8c0: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
b8d0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
b8e0: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
b8f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
b900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b910: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
b920: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
b930: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
b940: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
b950: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
b960: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
b970: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
b980: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
b990: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
b9a0: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
b9b0: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
b9c0: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
b9d0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
b9e0: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
b9f0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
ba00: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
ba10: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
ba20: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
ba30: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
ba40: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
ba50: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
ba60: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
ba70: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
ba80: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
ba90: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
baa0: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
bab0: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
bac0: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29  Arg, (u8)enc, 0)
bad0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70 2d  ;.  if( p && (p-
bae0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
baf0: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
bb00: 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72  )==enc && p->nAr
bb10: 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g==nArg ){.    i
bb20: 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
bb30: 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
bb40: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
bb50: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
bb60: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
bb70: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72  lete/modify user
bb80: 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f  -function due to
bb90: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
bba0: 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ts");.      asse
bbb0: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
bbc0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
bbd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
bbe0: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
bbf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
bc00: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
bc10: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  nts(db);.    }. 
bc20: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
bc30: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
bc40: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
bc50: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75   nName, nArg, (u
bc60: 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73  8)enc, 1);.  ass
bc70: 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ert(p || db->mal
bc80: 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66  locFailed);.  if
bc90: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
bca0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
bcb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
bcc0: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f   older version o
bcd0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  f the function w
bce0: 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64  ith a configured
bcf0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20   destructor is. 
bd00: 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63   ** being replac
bd10: 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  ed invoke the de
bd20: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
bd30: 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e  n here. */.  fun
bd40: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
bd50: 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73   p);..  if( pDes
bd60: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70  tructor ){.    p
bd70: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
bd80: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65  ++;.  }.  p->pDe
bd90: 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74  structor = pDest
bda0: 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e  ructor;.  p->fun
bdb0: 63 46 6c 61 67 73 20 26 3d 20 53 51 4c 49 54 45  cFlags &= SQLITE
bdc0: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 3b 0a 20  _FUNC_ENCMASK;. 
bdd0: 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e   p->xFunc = xFun
bde0: 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20  c;.  p->xStep = 
bdf0: 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e  xStep;.  p->xFin
be00: 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a  alize = xFinal;.
be10: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
be20: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d   pUserData;.  p-
be30: 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72  >nArg = (u16)nAr
be40: 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
be50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
be60: 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20  Create new user 
be70: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  functions..*/.in
be80: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
be90: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
bea0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
beb0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
bec0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
bed0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
bee0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
bef0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
bf00: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
bf10: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
bf20: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
bf30: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
bf40: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
bf50: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
bf60: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
bf70: 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  t*).){.  return 
bf80: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
bf90: 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  unction_v2(db, z
bfa0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
bfb0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
bfc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29        xFinal, 0)
bff0: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
c000: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
c010: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
c020: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
c030: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
c040: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
c050: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
c060: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
c070: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
c080: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c090: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
c0a0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
c0b0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c0c0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
c0d0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
c0e0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
c0f0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
c100: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69  )(void *).){.  i
c110: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
c120: 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74  RROR;.  FuncDest
c130: 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30  ructor *pArg = 0
c140: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
c150: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
c160: 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72  x);.  if( xDestr
c170: 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d  oy ){.    pArg =
c180: 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72   (FuncDestructor
c190: 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
c1a0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
c1b0: 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72  f(FuncDestructor
c1c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72  ));.    if( !pAr
c1d0: 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73 74  g ){.      xDest
c1e0: 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f  roy(p);.      go
c1f0: 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  to out;.    }.  
c200: 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79    pArg->xDestroy
c210: 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20   = xDestroy;.   
c220: 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61   pArg->pUserData
c230: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = p;.  }.  rc =
c240: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
c250: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  nc(db, zFunc, nA
c260: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
c270: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
c280: 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70  , pArg);.  if( p
c290: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65  Arg && pArg->nRe
c2a0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
c2b0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
c2c0: 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f  K );.    xDestro
c2d0: 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  y(p);.    sqlite
c2e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 72 67  3DbFree(db, pArg
c2f0: 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20  );.  }.. out:.  
c300: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
c310: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
c320: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
c330: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
c340: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
c350: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c360: 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c  IT_UTF16.int sql
c370: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
c380: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
c390: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76  3 *db,.  const v
c3a0: 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  oid *zFunctionNa
c3b0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
c3c0: 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
c3d0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
c3e0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
c3f0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
c400: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
c410: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
c420: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
c430: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
c440: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
c450: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
c460: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
c470: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
c480: 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74  *zFunc8;.  sqlit
c490: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
c4a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
c4b0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
c4c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e  Failed );.  zFun
c4d0: 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  c8 = sqlite3Utf1
c4e0: 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69  6to8(db, zFuncti
c4f0: 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49  onName, -1, SQLI
c500: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
c510: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
c520: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
c530: 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78  unc8, nArg, eTex
c540: 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20  tRep, p, xFunc, 
c550: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29  xStep, xFinal,0)
c560: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
c570: 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20  e(db, zFunc8);. 
c580: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
c590: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
c5a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c5b0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
c5c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
c5d0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
c5e0: 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e  clare that a fun
c5f0: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f  ction has been o
c600: 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76  verloaded by a v
c610: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
c620: 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74  .** If the funct
c630: 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73  ion already exis
c640: 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20  ts as a regular 
c650: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c  global function,
c660: 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
c670: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
c680: 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  .  If the functi
c690: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
c6a0: 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a  t, then create.*
c6b0: 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74  * a new one that
c6c0: 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61   always throws a
c6d0: 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e   run-time error.
c6e0: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69    .**.** When vi
c6f0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74  rtual tables int
c700: 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61  end to provide a
c710: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e  n overloaded fun
c720: 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73  ction, they.** s
c730: 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20  hould call this 
c740: 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20  routine to make 
c750: 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  sure the global 
c760: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e  function exists.
c770: 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e  .** A global fun
c780: 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74  ction must exist
c790: 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61   in order for na
c7a0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f  me resolution to
c7b0: 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c   work.** properl
c7c0: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
c7d0: 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
c7e0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
c7f0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
c800: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
c810: 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61  Arg.){.  int nNa
c820: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
c830: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  en30(zName);.  i
c840: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c850: 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  K;.  sqlite3_mut
c860: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
c870: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
c880: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
c890: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
c8a0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
c8b0: 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  F8, 0)==0 ){.   
c8c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
c8d0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d  ateFunc(db, zNam
c8e0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
c8f0: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20  UTF8,.          
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c   0, sqlite3Inval
c920: 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
c930: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  , 0);.  }.  rc =
c940: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
c950: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
c960: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
c970: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
c980: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
c990: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
c9a0: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  RACE./*.** Regis
c9b0: 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63  ter a trace func
c9c0: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
c9d0: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
c9e0: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74  sly registered t
c9f0: 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  race.** is retur
ca00: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
ca10: 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69  ULL trace functi
ca20: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
ca30: 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63   tracing is exec
ca40: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
ca50: 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20  L.** trace is a 
ca60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
ca70: 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
ca80: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61  voked at the sta
ca90: 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51  rt of each.** SQ
caa0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  L statement..*/.
cab0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72  void *sqlite3_tr
cac0: 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ace(sqlite3 *db,
cad0: 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28   void (*xTrace)(
cae0: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
caf0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
cb00: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
cb10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
cb20: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
cb30: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54  .  pOld = db->pT
cb40: 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  raceArg;.  db->x
cb50: 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a  Trace = xTrace;.
cb60: 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20    db->pTraceArg 
cb70: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
cb80: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
cb90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
cba0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a  rn pOld;.}./*.**
cbb0: 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66   Register a prof
cbc0: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ile function.  T
cbd0: 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
cbe0: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
cbf0: 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69  stered .** profi
cc00: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  le function is r
cc10: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
cc20: 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20   A NULL profile 
cc30: 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
cc40: 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67  hat no profiling
cc50: 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
cc60: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f   non-NULL.** pro
cc70: 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65  file is a pointe
cc80: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
cc90: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
cca0: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
ccb0: 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c  n of.** each SQL
ccc0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
ccd0: 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  is run..*/.void 
cce0: 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65  *sqlite3_profile
ccf0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
cd00: 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69  .  void (*xProfi
cd10: 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  le)(void*,const 
cd20: 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e  char*,sqlite_uin
cd30: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
cd40: 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  rg.){.  void *pO
cd50: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
cd60: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
cd70: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
cd80: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a  b->pProfileArg;.
cd90: 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d    db->xProfile =
cda0: 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d   xProfile;.  db-
cdb0: 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70  >pProfileArg = p
cdc0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
cdd0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
cde0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
cdf0: 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
ce00: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
ce10: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
ce20: 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f  gister a functio
ce30: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
ce40: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
ce50: 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49  on commits..** I
ce60: 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75  f the invoked fu
ce70: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
ce80: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
ce90: 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73  e commit becomes
cea0: 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a   a.** rollback..
ceb0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
cec0: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20  _commit_hook(.  
ced0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
cee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
cef0: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
cf00: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
cf10: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
cf20: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20  ck)(void*),  /* 
cf30: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f  Function to invo
cf40: 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69  ke on each commi
cf50: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  t */.  void *pAr
cf60: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
cf70: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
cf80: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
cf90: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
cfa0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
cfb0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
cfc0: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
cfd0: 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62  pCommitArg;.  db
cfe0: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
cff0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
d000: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20   db->pCommitArg 
d010: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d020: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d030: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d040: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pOld;.}../*.*
d050: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
d060: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
d070: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
d080: 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
d090: 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
d0a0: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
d0b0: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
d0c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
d0d0: 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
d0e0: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
d0f0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
d100: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
d110: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
d120: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
d130: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
d140: 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
d150: 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c   *,char const *,
d160: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20  sqlite_int64),. 
d170: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d190: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d1a0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d1b0: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
d1c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d1d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d1e0: 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74  Ret = db->pUpdat
d1f0: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64  eArg;.  db->xUpd
d200: 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
d210: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
d220: 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67  UpdateArg = pArg
d230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d240: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d250: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
d260: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  t;.}../*.** Regi
d270: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
d280: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
d290: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
d2a0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a  ction is rolled.
d2b0: 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20  ** back by this 
d2c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d2d0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
d2e0: 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
d2f0: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
d300: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
d310: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
d320: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
d330: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
d340: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
d350: 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  *), /* Callback 
d360: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
d370: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
d380: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
d390: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
d3a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
d3b0: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
d3c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
d3d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
d3e0: 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
d3f0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
d400: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
d410: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
d420: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
d430: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
d440: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d450: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d460: 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
d470: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
d480: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
d490: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
d4a0: 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
d4b0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c  d by sqlite3_wal
d4c0: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
d4d0: 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  )..** Invoke sql
d4e0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
d4f0: 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  int if the numbe
d500: 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
d510: 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69  he log file.** i
d520: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  s greater than s
d530: 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63  qlite3.pWalArg c
d540: 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ast to an intege
d550: 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  r (the value con
d560: 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61  figured by.** wa
d570: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
d580: 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ())..*/ .int sql
d590: 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
d5a0: 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69  ok(.  void *pCli
d5b0: 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
d5c0: 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  Argument */.  sq
d5d0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
d5e0: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
d5f0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
d600: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f  ar *zDb,       /
d610: 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  * Database */.  
d620: 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20  int nFrame      
d630: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
d640: 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66  f WAL */.){.  if
d650: 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45  ( nFrame>=SQLITE
d660: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69  _PTR_TO_INT(pCli
d670: 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20  entData) ){.    
d680: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
d690: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
d6a0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
d6b0: 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
d6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
d6d0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d6e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
d6f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
d700: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
d710: 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  AL */../*.** Con
d720: 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65  figure an sqlite
d730: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
d740: 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74  lback to automat
d750: 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e  ically checkpoin
d760: 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  t.** a database 
d770: 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67  after committing
d780: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
d790: 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61  f there are nFra
d7a0: 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72  me or.** more fr
d7b0: 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
d7c0: 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65  file. Passing ze
d7d0: 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65  ro or a negative
d7e0: 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a   value as the.**
d7f0: 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65   nFrame paramete
d800: 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d  r disables autom
d810: 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73  atic checkpoints
d820: 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a   entirely..**.**
d830: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65   The callback re
d840: 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73  gistered by this
d850: 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63   function replac
d860: 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  es any existing 
d870: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69  callback.** regi
d880: 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c  stered using sql
d890: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e  ite3_wal_hook().
d8a0: 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73   Likewise, regis
d8b0: 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63  tering a callbac
d8c0: 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74  k.** using sqlit
d8d0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69  e3_wal_hook() di
d8e0: 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d  sables the autom
d8f0: 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20  atic checkpoint 
d900: 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e  mechanism.** con
d910: 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20  figured by this 
d920: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
d930: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
d940: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  ocheckpoint(sqli
d950: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72  te3 *db, int nFr
d960: 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ame){.#ifdef SQL
d970: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55  ITE_OMIT_WAL.  U
d980: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d990: 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
d9a0: 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b  RAMETER(nFrame);
d9b0: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 46 72  .#else.  if( nFr
d9c0: 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ame>0 ){.    sql
d9d0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
d9e0: 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  , sqlite3WalDefa
d9f0: 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f  ultHook, SQLITE_
da00: 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d  INT_TO_PTR(nFram
da10: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
da20: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
da30: 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  ok(db, 0, 0);.  
da40: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
da50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
da60: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
da70: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
da80: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
da90: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
daa0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
dab0: 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  to the write-ahe
dac0: 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64  ad-log by this d
dad0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
dae0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
daf0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20  ite3_wal_hook(. 
db00: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
db30: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68  ook to this db h
db40: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a  andle */.  int(*
db50: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
db60: 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e  *, sqlite3*, con
db70: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a  st char*, int),.
db80: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
dbb0: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43  ent passed to xC
dbc0: 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a  allback() */.){.
dbd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dbe0: 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a  MIT_WAL.  void *
dbf0: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
dc00: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
dc10: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
dc20: 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
dc30: 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
dc40: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
dc50: 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
dc60: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
dc70: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
dc80: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
dc90: 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
dca0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
dcb0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
dcc0: 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a  t database zDb..
dcd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
dce0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
dcf0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
dd20: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
dd30: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dd50: 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20  ame of attached 
dd60: 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c  database (or NUL
dd70: 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64  L) */.  int eMod
dd80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dd90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
dda0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76  E_CHECKPOINT_* v
ddb0: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
ddc0: 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20  nLog,           
ddd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
dde0: 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f  : Size of WAL lo
ddf0: 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20  g in frames */. 
de00: 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20   int *pnCkpt    
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e   /* OUT: Total n
de30: 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
de40: 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a  checkpointed */.
de50: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
de60: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75  _OMIT_WAL.  retu
de70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
de80: 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  lse.  int rc;   
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
deb0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  code */.  int iD
dec0: 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  b = SQLITE_MAX_A
ded0: 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c  TTACHED;  /* sql
dee0: 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78  ite3.aDb[] index
def0: 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70   of db to checkp
df00: 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e  oint */..  /* In
df10: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74  itialize the out
df20: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f  put variables to
df30: 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65   -1 in case an e
df40: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
df50: 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70    if( pnLog ) *p
df60: 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28  nLog = -1;.  if(
df70: 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70   pnCkpt ) *pnCkp
df80: 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72  t = -1;..  asser
df90: 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
dfa0: 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c 49 54 45  OINT_FULL>SQLITE
dfb0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
dfc0: 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
dfd0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
dfe0: 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54 45 5f 43  NT_FULL<SQLITE_C
dff0: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
e000: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  T );.  assert( S
e010: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e020: 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53 51 4c 49  _PASSIVE+2==SQLI
e030: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
e040: 53 54 41 52 54 20 29 3b 0a 20 20 69 66 28 20 65  START );.  if( e
e050: 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43  Mode<SQLITE_CHEC
e060: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c  KPOINT_PASSIVE |
e070: 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43  | eMode>SQLITE_C
e080: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
e090: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
e0a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
e0b0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
e0c0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e0d0: 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20  tex);.  if( zDb 
e0e0: 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20  && zDb[0] ){.   
e0f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
e100: 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
e110: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  );.  }.  if( iDb
e120: 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
e130: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
e140: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
e150: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
e160: 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
e170: 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20  e: %s", zDb);.  
e180: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
e190: 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
e1a0: 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65  t(db, iDb, eMode
e1b0: 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
e1c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
e1d0: 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
e1e0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
e1f0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
e200: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
e210: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
e220: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
e230: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
e240: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
e250: 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44  abase zDb. If zD
e260: 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66  b is NULL, or if
e270: 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20   the buffer zDb 
e280: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e  points.** to con
e290: 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e  tains a zero-len
e2a0: 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20  gth string, all 
e2b0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
e2c0: 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b  es are .** check
e2d0: 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  pointed..*/.int 
e2e0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
e2f0: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
e300: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
e310: 7a 44 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  zDb){.  return s
e320: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
e330: 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62  point_v2(db, zDb
e340: 2c 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  , SQLITE_CHECKPO
e350: 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 30 2c 20  INT_PASSIVE, 0, 
e360: 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
e370: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
e380: 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b  *.** Run a check
e390: 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73  point on databas
e3a0: 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61  e iDb. This is a
e3b0: 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61   no-op if databa
e3c0: 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74  se iDb is.** not
e3d0: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
e3e0: 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  in WAL mode..**.
e3f0: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
e400: 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
e410: 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
e420: 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20  g checkpointed, 
e430: 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
e440: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
e450: 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68  _LOCKED and a ch
e460: 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  eckpoint is not 
e470: 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a  attempted. If .*
e480: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
e490: 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  s while running 
e4a0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  the checkpoint, 
e4b0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
e4c0: 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
e4d0: 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54  rned (i.e. SQLIT
e4e0: 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77  E_IOERR). Otherw
e4f0: 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
e500: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
e510: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
e520: 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20  le db should be 
e530: 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c  held by the call
e540: 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a  er. The mutex.**
e550: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
e560: 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d   the specific b-
e570: 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
e580: 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e  pointed is taken
e590: 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63   by.** this func
e5a0: 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63  tion while the c
e5b0: 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e  heckpoint is run
e5c0: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ning..**.** If i
e5d0: 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c  Db is passed SQL
e5e0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
e5f0: 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63  , then all attac
e600: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
e610: 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65  e.** checkpointe
e620: 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  d. If an error i
e630: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
e640: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
e650: 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f  ediately -.** no
e660: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
e670: 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   to checkpoint a
e680: 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74  ny remaining dat
e690: 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61  abases..**.** Pa
e6a0: 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73  rameter eMode is
e6b0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
e6c0: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
e6d0: 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41  E, FULL or RESTA
e6e0: 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  RT..*/.int sqlit
e6f0: 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  e3Checkpoint(sql
e700: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
e710: 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e  b, int eMode, in
e720: 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70  t *pnLog, int *p
e730: 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63  nCkpt){.  int rc
e740: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e760: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
e770: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e790: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
e7a0: 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65   through attache
e7b0: 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62  d dbs */.  int b
e7c0: 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Busy = 0;       
e7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
e7e0: 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53  ue if SQLITE_BUS
e7f0: 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75  Y has been encou
e800: 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ntered */..  ass
e810: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e820: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
e830: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
e840: 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67  !pnLog || *pnLog
e850: 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ==-1 );.  assert
e860: 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e  ( !pnCkpt || *pn
e870: 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66  Ckpt==-1 );..  f
e880: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
e890: 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b && rc==SQLITE_
e8a0: 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  OK; i++){.    if
e8b0: 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d  ( i==iDb || iDb=
e8c0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
e8d0: 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63  CHED ){.      rc
e8e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e8f0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44  heckpoint(db->aD
e900: 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c  b[i].pBt, eMode,
e910: 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
e920: 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30  .      pnLog = 0
e930: 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d  ;.      pnCkpt =
e940: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
e950: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
e960: 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d  .        bBusy =
e970: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
e980: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
e990: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e9a0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
e9b0: 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29  ITE_OK && bBusy)
e9c0: 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
e9d0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
e9e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
e9f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
ea00: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
ea10: 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
ea20: 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
ea30: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
ea40: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
ea50: 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
ea60: 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
ea70: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ea80: 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
ea90: 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
eaa0: 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
eab0: 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
eac0: 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
ead0: 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
eae0: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
eaf0: 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
eb00: 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
eb10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
eb20: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
eb30: 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
eb40: 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
eb50: 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
eb60: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
eb70: 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
eb80: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
eb90: 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
eba0: 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
ebb0: 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
ebc0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
ebd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
ebe0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
ebf0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
ec00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec10: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
ec40: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
ec50: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
ec80: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
ec90: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
eca0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
ecb0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
ecc0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
ecd0: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
ece0: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
ecf0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
ed10: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
ed20: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
ed60: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
ed90: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
eda0: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
edd0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
ede0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
edf0: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
ee00: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
ee10: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
ee20: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
ee30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
ee40: 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
ee50: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
ee60: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
ee70: 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
ee80: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
ee90: 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
eea0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
eeb0: 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
eec0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
eed0: 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
eee0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
eef0: 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31  RE==3.  return 1
ef00: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
ef10: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31  ITE_TEMP_STORE<1
ef20: 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   || SQLITE_TEMP_
ef30: 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e  STORE>3.  return
ef40: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
ef50: 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38  .** Return UTF-8
ef60: 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
ef70: 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
ef80: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
ef90: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
efa0: 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
efb0: 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
efc0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
efd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
efe0: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
eff0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
f000: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
f010: 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  EM);.  }.  if( !
f020: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f030: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
f040: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
f050: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
f060: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a  E_MISUSE_BKPT);.
f070: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
f080: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f090: 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
f0a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f0b0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
f0c0: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
f0d0: 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EM);.  }else{.  
f0e0: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c    z = (char*)sql
f0f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
f100: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61  db->pErr);.    a
f110: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
f120: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
f130: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
f140: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
f150: 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
f160: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
f170: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f180: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f190: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
f1a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f1b0: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74  _UTF16./*.** Ret
f1c0: 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  urn UTF-16 encod
f1d0: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
f1e0: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
f1f0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
f200: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
f210: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
f220: 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c  te3_errmsg16(sql
f230: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
f240: 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75  tic const u16 ou
f250: 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20  tOfMem[] = {.   
f260: 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
f270: 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27  ' ', 'o', 'f', '
f280: 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d   ', 'm', 'e', 'm
f290: 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27  ', 'o', 'r', 'y'
f2a0: 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  , 0.  };.  stati
f2b0: 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75  c const u16 misu
f2c0: 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27  se[] = {.    'l'
f2d0: 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c  , 'i', 'b', 'r',
f2e0: 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'a', 'r', 'y', 
f2f0: 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27  ' ', .    'r', '
f300: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69  o', 'u', 't', 'i
f310: 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27  ', 'n', 'e', ' '
f320: 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c  , .    'c', 'a',
f330: 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20   'l', 'l', 'e', 
f340: 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'd', ' ', .    '
f350: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
f360: 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27  ', .    'o', 'f'
f370: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c  , ' ', .    's',
f380: 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20   'e', 'q', 'u', 
f390: 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27  'e', 'n', 'c', '
f3a0: 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f  e', 0.  };..  co
f3b0: 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69  nst void *z;.  i
f3c0: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
f3d0: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74  turn (void *)out
f3e0: 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  OfMem;.  }.  if(
f3f0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f400: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
f410: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
f420: 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20  void *)misuse;. 
f430: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f440: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f450: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
f460: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f470: 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f     z = (void *)o
f480: 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65  utOfMem;.  }else
f490: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
f4a0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
f4b0: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66  b->pErr);.    if
f4c0: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
f4d0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
f4e0: 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
f4f0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
f500: 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20  b->errCode),.   
f510: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
f520: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
f530: 49 43 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73  IC);.      z = s
f540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f550: 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
f560: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61     }.    /* A ma
f570: 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20  lloc() may have 
f580: 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68  failed within th
f590: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f5a0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
f5b0: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49  .    ** above. I
f5c0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
f5d0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d  se, then the db-
f5e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
f5f0: 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  ag needs to.    
f600: 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  ** be cleared be
f610: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
f620: 44 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79  Do this directly
f630: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61  , instead of via
f640: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41  .    ** sqlite3A
f650: 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f  piExit(), to avo
f660: 69 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64  id setting the d
f670: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65  atabase handle e
f680: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20  rror message..  
f690: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
f6a0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
f6b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f6c0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f6d0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
f6e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f6f0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
f700: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
f710: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
f720: 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72  error code gener
f730: 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74  ated by an SQLit
f740: 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55  e routine. If NU
f750: 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20  LL is.** passed 
f760: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
f770: 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61  , we assume a ma
f780: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75  lloc() failed du
f790: 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65  ring sqlite3_ope
f7a0: 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
f7b0: 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  te3_errcode(sqli
f7c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
f7d0: 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
f7e0: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
f7f0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
f800: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
f810: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
f820: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
f830: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f840: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f850: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
f860: 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26  rn db->errCode &
f870: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
f880: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
f890: 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c  nded_errcode(sql
f8a0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
f8b0: 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
f8c0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
f8d0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
f8e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
f8f0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
f900: 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
f910: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f930: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
f940: 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b  urn db->errCode;
f950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f960: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
f970: 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
f980: 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
f990: 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
f9a0: 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f  rgument.  For no
f9b0: 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63  w, this simply c
f9c0: 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61  alls the interna
f9d0: 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  l sqlite3ErrStr(
f9e0: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ).** function..*
f9f0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
fa00: 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74  lite3_errstr(int
fa10: 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   rc){.  return s
fa20: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
fa30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
fa40: 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  e a new collatin
fa50: 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  g function for d
fa60: 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54  atabase "db".  T
fa70: 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65  he name is zName
fa80: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f  .** and the enco
fa90: 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a  ding is enc..*/.
faa0: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
fab0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  eCollation(.  sq
fac0: 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e  lite3* db,.  con
fad0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
fae0: 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69  .  u8 enc,.  voi
faf0: 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
fb00: 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
fb10: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
fb20: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
fb30: 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
fb40: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c  void*).){.  Coll
fb50: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
fb60: 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e  t enc2;.  int nN
fb70: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
fb80: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
fb90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fba0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
fbb0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
fbc0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
fbd0: 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
fbe0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
fbf0: 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
fc00: 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
fc10: 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
fc20: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
fc30: 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
fc40: 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
fc50: 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
fc60: 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
fc70: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
fc80: 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20  ..  */.  enc2 = 
fc90: 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28  enc;.  testcase(
fca0: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
fcb0: 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  F16 );.  testcas
fcc0: 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
fcd0: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b  UTF16_ALIGNED );
fce0: 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c  .  if( enc2==SQL
fcf0: 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63  ITE_UTF16 || enc
fd00: 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
fd10: 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65  ALIGNED ){.    e
fd20: 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  nc2 = SQLITE_UTF
fd30: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20  16NATIVE;.  }.  
fd40: 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f  if( enc2<SQLITE_
fd50: 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c  UTF8 || enc2>SQL
fd60: 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20  ITE_UTF16BE ){. 
fd70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fd80: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
fd90: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
fda0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65   this call is re
fdb0: 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63  moving or replac
fdc0: 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ing an existing 
fdd0: 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20  collation .  ** 
fde0: 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c  sequence. If so,
fdf0: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
fe00: 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72  ctive VMs, retur
fe10: 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65  n busy. If there
fe20: 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  .  ** are no act
fe30: 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64  ive VMs, invalid
fe40: 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70  ate any pre-comp
fe50: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
fe60: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  */.  pColl = 
fe70: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
fe80: 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
fe90: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66   zName, 0);.  if
fea0: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c  ( pColl && pColl
feb0: 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66  ->xCmp ){.    if
fec0: 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
fed0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
fee0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
fef0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
ff00: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
ff10: 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
ff20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
ff30: 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
ff40: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
ff50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ff60: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
ff70: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
ff80: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
ff90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f  );..    /* If co
ffa0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
ffb0: 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74   pColl was creat
ffc0: 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61  ed directly by a
ffd0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
ffe0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
fff0: 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f  ollation, and no
10000 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  t generated by s
10010 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20  ynthCollSeq(),. 
10020 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63     ** then any c
10030 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79  opies made by sy
10040 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65  nthCollSeq() nee
10050 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61  d to be invalida
10060 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  ted..    ** Also
10070 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74  , collation dest
10080 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71  ructor - CollSeq
10090 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69  .xDel() - functi
100a0 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  on may need.    
100b0 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e  ** to be called.
100c0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28  .    */ .    if(
100d0 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e   (pColl->enc & ~
100e0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
100f0 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20  GNED)==enc2 ){. 
10100 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43       CollSeq *aC
10110 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
10120 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
10130 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Seq, zName, nNam
10140 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  e);.      int j;
10150 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
10160 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<3; j++){.     
10170 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20     CollSeq *p = 
10180 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  &aColl[j];.     
10190 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70     if( p->enc==p
101a0 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
101b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44         if( p->xD
101c0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  el ){.          
101d0 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73    p->xDel(p->pUs
101e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
101f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43  .          p->xC
10200 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mp = 0;.        
10210 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10220 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    }..  pColl = s
10230 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
10240 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
10250 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28  zName, 1);.  if(
10260 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75   pColl==0 ) retu
10270 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10280 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
10290 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
102a0 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
102b0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
102c0 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
102d0 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
102e0 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
102f0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
10300 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
10310 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
10320 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
10330 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
10340 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66  * This array def
10350 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20  ines hard upper 
10360 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20  bounds on limit 
10370 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20  values.  The.** 
10380 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74  initializer must
10390 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63   be kept in sync
103a0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
103b0 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66  _LIMIT_*.** #def
103c0 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e  ines in sqlite3.
103d0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  h..*/.static con
103e0 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69  st int aHardLimi
103f0 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45  t[] = {.  SQLITE
10400 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _MAX_LENGTH,.  S
10410 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
10420 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
10430 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c  AX_COLUMN,.  SQL
10440 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
10450 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
10460 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
10470 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
10480 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45  DBE_OP,.  SQLITE
10490 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
104a0 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  G,.  SQLITE_MAX_
104b0 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49  ATTACHED,.  SQLI
104c0 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
104d0 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  ERN_LENGTH,.  SQ
104e0 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
104f0 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49  E_NUMBER,.  SQLI
10500 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
10510 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  EPTH,.};../*.** 
10520 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
10530 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
10540 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
10550 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
10560 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
10570 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
10580 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
10590 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
105a0 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
105b0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
105c0 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
105d0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
105e0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
105f0 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
10600 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10610 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
10620 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
10630 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10640 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
10650 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
10660 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
10670 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
10680 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
10690 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
106a0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
106b0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
106c0 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
106d0 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
106e0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
106f0 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
10700 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
10710 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
10720 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
10730 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10740 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
10750 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
10760 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f  _ARG>1000.# erro
10770 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
10780 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
10790 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
107a0 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  1000.#endif.#if 
107b0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
107c0 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
107d0 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 36 32 0a  MAX_ATTACHED>62.
107e0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
107f0 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
10800 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
10810 64 20 36 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  d 62.#endif.#if 
10820 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
10830 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
10840 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10850 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
10860 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
10870 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
10880 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10890 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
108a0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
108b0 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
108c0 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
108d0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
108e0 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
108f0 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
10900 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
10910 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
10920 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a  least 1.#endif..
10930 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10940 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
10950 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
10960 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
10970 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
10980 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
10990 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
109a0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
109b0 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
109c0 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
109d0 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
109e0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
109f0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
10a00 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
10a10 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
10a20 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
10a30 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
10a40 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
10a50 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
10a60 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
10a70 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
10a80 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
10a90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
10aa0 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
10ab0 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
10ac0 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a  oldLimit;...  /*
10ad0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10ae0 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20  30189-54097 For 
10af0 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67  each limit categ
10b00 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  ory SQLITE_LIMIT
10b10 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65  _NAME.  ** there
10b20 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72   is a hard upper
10b30 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f   bound set at co
10b40 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20  mpile-time by a 
10b50 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20  C preprocessor. 
10b60 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64   ** macro called
10b70 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45   SQLITE_MAX_NAME
10b80 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22  . (The "_LIMIT_"
10b90 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20   in the name is 
10ba0 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20  changed to.  ** 
10bb0 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20  "_MAX_".).  */. 
10bc0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
10bd0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10be0 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
10bf0 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
10c00 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
10c10 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10c20 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  _SQL_LENGTH]==SQ
10c30 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
10c40 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
10c50 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10c60 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
10c70 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  ==SQLITE_MAX_COL
10c80 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UMN );.  assert(
10c90 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10ca0 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
10cb0 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
10cc0 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20  _EXPR_DEPTH );. 
10cd0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
10ce0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10cf0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
10d00 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
10d10 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a  MPOUND_SELECT);.
10d20 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
10d30 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
10d40 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49  T_VDBE_OP]==SQLI
10d50 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29  TE_MAX_VDBE_OP )
10d60 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
10d70 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
10d80 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
10d90 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  ]==SQLITE_MAX_FU
10da0 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20  NCTION_ARG );.  
10db0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
10dc0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
10dd0 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54  ATTACHED]==SQLIT
10de0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
10df0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
10e00 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
10e10 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
10e20 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20  _LENGTH]==.     
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10e60 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
10e70 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  N_LENGTH );.  as
10e80 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
10e90 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
10ea0 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d  RIABLE_NUMBER]==
10eb0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
10ec0 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61  BLE_NUMBER);.  a
10ed0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
10ee0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  t[SQLITE_LIMIT_T
10ef0 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53  RIGGER_DEPTH]==S
10f00 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
10f10 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
10f20 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ert( SQLITE_LIMI
10f30 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d  T_TRIGGER_DEPTH=
10f40 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  =(SQLITE_N_LIMIT
10f50 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c  -1) );...  if( l
10f60 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
10f70 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
10f80 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
10f90 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
10fa0 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
10fb0 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
10fc0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34     /* IMP: R-524
10ff0 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20  76-28732 */.    
11000 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
11010 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
11020 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
11030 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
11040 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d  limitId];  /* IM
11050 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34  P: R-51463-25634
11060 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   */.    }.    db
11070 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
11080 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
11090 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
110a0 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
110b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
110c0 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a   R-53341-35419 *
110d0 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  /.}../*.** This 
110e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
110f0 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55   to parse both U
11100 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20  RIs and non-URI 
11110 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64  filenames passed
11120 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20   by the.** user 
11130 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
11140 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
11150 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
11160 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61  v2(), and for da
11170 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73  tabase.** URIs s
11180 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
11190 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65   of ATTACH state
111a0 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
111b0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
111c0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
111d0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
111e0 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28  the VFS to use (
111f0 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20  or.** a NULL to 
11200 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61  signify the defa
11210 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20  ult VFS) if the 
11220 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  URI does not con
11230 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22  tain a "vfs=xxx"
11240 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
11250 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
11260 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  argument contain
11270 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f  s the URI (or no
11280 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a  n-URI filename).
11290 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20  ** itself. When 
112a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
112b0 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c   called the *pFl
112c0 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ags variable sho
112d0 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74  uld contain.** t
112e0 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73  he default flags
112f0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
11300 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74  abase handle wit
11310 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f  h. The value sto
11320 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67  red in.** *pFlag
11330 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64  s may be updated
11340 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11350 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  g if the URI fil
11360 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a  ename contains .
11370 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f  ** "cache=xxx" o
11380 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65  r "mode=xxx" que
11390 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
113a0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
113b0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
113c0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
113d0 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69  is case *ppVfs i
113e0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
113f0 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61  o.** the VFS tha
11400 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
11410 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
11420 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46  abase file. *pzF
11430 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  ile is set to.**
11440 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
11450 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
11460 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
11470 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69  le to open. It i
11480 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
11490 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
114a0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
114b0 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65  ally call sqlite
114c0 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65  3_free() to rele
114d0 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
114e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  er..**.** If an 
114f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
11500 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  en an SQLite err
11510 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
11520 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73  ned and *pzErrMs
11530 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  g.** may be set 
11540 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
11550 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
11560 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
11570 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65  age error .** me
11580 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
11590 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
115a0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
115b0 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
115c0 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
115d0 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  er by calling sq
115e0 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
115f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73  .int sqlite3Pars
11600 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68  eUri(.  const ch
11610 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c  ar *zDefaultVfs,
11620 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
11630 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73  o use if no "vfs
11640 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69  =xxx" query opti
11650 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
11660 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20  ar *zUri,       
11670 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
11680 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f  erminated URI to
11690 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69   parse */.  unsi
116a0 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73  gned int *pFlags
116b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
116c0 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50  N/OUT: SQLITE_OP
116d0 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EN_XXX flags */.
116e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a    sqlite3_vfs **
116f0 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  ppVfs,          
11700 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f    /* OUT: VFS to
11710 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20   use */ .  char 
11720 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  **pzFile,       
11730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
11740 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70  T: Filename comp
11750 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a  onent of URI */.
11760 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
11770 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
11780 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
11790 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d  message (if rc!=
117a0 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b  SQLITE_OK) */.){
117b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
117c0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
117d0 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70  d int flags = *p
117e0 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  Flags;.  const c
117f0 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66  har *zVfs = zDef
11800 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20  aultVfs;.  char 
11810 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63  *zFile;.  char c
11820 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73  ;.  int nUri = s
11830 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11840 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Uri);..  assert(
11850 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b   *pzErrMsg==0 );
11860 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20  ..  if( ((flags 
11870 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
11880 49 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  I) || sqlite3Glo
11890 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
118a0 72 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e  ri) .   && nUri>
118b0 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
118c0 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
118d0 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  0 .  ){.    char
118e0 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
118f0 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
11900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11910 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
11920 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
11930 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
11960 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
11970 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11990 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
119a0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
119b0 6e 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  nt nByte = nUri+
119c0 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
119d0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
119e0 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
119f0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11a00 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
11a10 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
11a20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
11a30 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
11a40 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
11a50 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
11a60 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
11a70 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
11a80 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
11a90 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
11aa0 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
11ab0 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
11ac0 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
11ad0 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
11ae0 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
11af0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
11b00 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
11b10 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
11b20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
11b30 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66      iIn = 5;.#if
11b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  ndef SQLITE_ALLO
11b50 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a  W_URI_AUTHORITY.
11b60 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
11b70 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75  he scheme and au
11b80 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73  thority segments
11b90 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a   of the URI. */.
11ba0 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d      if( zUri[5]=
11bb0 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d  ='/' && zUri[6]=
11bc0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='/' ){.      iI
11bd0 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69  n = 7;.      whi
11be0 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
11bf0 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20   zUri[iIn]!='/' 
11c00 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69  ) iIn++;.      i
11c10 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49  f( iIn!=7 && (iI
11c20 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28  n!=16 || memcmp(
11c30 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55  "localhost", &zU
11c40 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20  ri[7], 9)) ){.  
11c50 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
11c60 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
11c70 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61  f("invalid uri a
11c80 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c  uthority: %.*s",
11c90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
11ca0 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a  n-7, &zUri[7]);.
11cb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
11cc0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
11cd0 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
11ce0 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  i_out;.      }. 
11cf0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
11d00 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c   /* Copy the fil
11d10 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75  ename and any qu
11d20 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69  ery parameters i
11d30 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75  nto the zFile bu
11d40 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65  ffer. .    ** De
11d50 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20  code %HH escape 
11d60 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20  codes along the 
11d70 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  way. .    **.   
11d80 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20   ** Within this 
11d90 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65  loop, variable e
11da0 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74  State may be set
11db0 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64   to 0, 1 or 2, d
11dc0 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
11dd0 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63  on the parsing c
11de0 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f  ontext. As follo
11df0 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
11e00 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66  *   0: Parsing f
11e10 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a  ile-name..    **
11e20 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61     1: Parsing na
11e30 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  me section of a 
11e40 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
11e50 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
11e60 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20  **   2: Parsing 
11e70 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66  value section of
11e80 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
11e90 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
11ea0 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65     */.    eState
11eb0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
11ec0 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
11ed0 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b  !=0 && c!='#' ){
11ee0 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
11ef0 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a      if( c=='%' .
11f00 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
11f10 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
11f20 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20  In]) .       && 
11f30 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
11f40 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20  zUri[iIn+1]) .  
11f50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
11f60 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69  nt octet = (sqli
11f70 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
11f80 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a  [iIn++]) << 4);.
11f90 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d          octet +=
11fa0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
11fb0 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a  (zUri[iIn++]);..
11fc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11fd0 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65  octet>=0 && octe
11fe0 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20  t<256 );.       
11ff0 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b   if( octet==0 ){
12000 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
12010 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
12020 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70  en when "%00" ap
12030 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65  pears within the
12040 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20   URI. In this.  
12050 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
12060 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65  we ignore all te
12070 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  xt in the remain
12080 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c  der of the path,
12090 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20   name or.       
120a0 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72     ** value curr
120b0 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73  ently being pars
120c0 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  ed. So ignore th
120d0 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63  e current charac
120e0 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ter.          **
120f0 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65   and skip to the
12100 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f   next "?", "=" o
12110 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70  r "&", as approp
12120 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  riate. */.      
12130 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
12140 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
12150 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20   c!='#' .       
12160 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
12170 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a  e!=0 || c!='?').
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
12190 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28   (eState!=1 || (
121a0 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27  c!='=' && c!='&'
121b0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
121c0 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c   && (eState!=2 |
121d0 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20  | c!='&').      
121e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
121f0 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
12200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12210 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12220 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
12230 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  octet;.      }el
12240 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31  se if( eState==1
12250 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63   && (c=='&' || c
12260 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  =='=') ){.      
12270 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74    if( zFile[iOut
12280 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1]==0 ){.      
12290 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20      /* An empty 
122a0 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e  option name. Ign
122b0 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ore this option 
122c0 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20  altogether. */. 
122d0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
122e0 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
122f0 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a  i[iIn]!='#' && z
12300 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20  Uri[iIn-1]!='&' 
12310 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ) iIn++;.       
12320 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12340 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20  f( c=='&' ){.   
12350 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75         zFile[iOu
12360 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
12370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12380 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32        eState = 2
12390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
123a0 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
123b0 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61   }else if( (eSta
123c0 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29  te==0 && c=='?')
123d0 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26   || (eState==2 &
123e0 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20  & c=='&') ){.   
123f0 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
12400 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a      eState = 1;.
12410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
12420 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b  ile[iOut++] = c;
12430 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
12440 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65  State==1 ) zFile
12450 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12460 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
12470 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
12480 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
12490 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  \0';..    /* Che
124a0 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ck if there were
124b0 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65   any options spe
124c0 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75  cified that shou
124d0 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  ld be interprete
124e0 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20  d .    ** here. 
124f0 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  Options that are
12500 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72   interpreted her
12510 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20  e include "vfs" 
12520 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20  and those that. 
12530 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
12540 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d   to flags that m
12550 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ay be passed to 
12560 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  the sqlite3_open
12570 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74  _v2().    ** met
12580 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74  hod. */.    zOpt
12590 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65   = &zFile[sqlite
125a0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
125b0 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
125c0 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zOpt[0] ){.     
125d0 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69   int nOpt = sqli
125e0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
125f0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
12600 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74  Val = &zOpt[nOpt
12610 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  +1];.      int n
12620 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Val = sqlite3Str
12630 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20  len30(zVal);..  
12640 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20      if( nOpt==3 
12650 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c  && memcmp("vfs",
12660 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a   zOpt, 3)==0 ){.
12670 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a          zVfs = z
12680 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Val;.      }else
12690 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
126a0 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20   OpenMode {.    
126b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
126c0 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69   *z;.          i
126d0 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  nt mode;.       
126e0 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20   } *aMode = 0;. 
126f0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f         char *zMo
12700 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  deType = 0;.    
12710 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30      int mask = 0
12720 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69  ;.        int li
12730 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  mit = 0;..      
12740 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26    if( nOpt==5 &&
12750 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c   memcmp("cache",
12760 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a   zOpt, 5)==0 ){.
12770 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
12780 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
12790 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20   aCacheMode[] = 
127a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
127b0 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54  "shared",  SQLIT
127c0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
127d0 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
127e0 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53    { "private", S
127f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
12800 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
12810 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
12820 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
12830 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
12840 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
12850 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50  DCACHE|SQLITE_OP
12860 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b  EN_PRIVATECACHE;
12870 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
12880 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20   = aCacheMode;. 
12890 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
128a0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20   mask;.         
128b0 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61   zModeType = "ca
128c0 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  che";.        }.
128d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
128e0 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d  ==4 && memcmp("m
128f0 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d  ode", zOpt, 4)==
12900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
12910 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
12920 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b  nMode aOpenMode[
12930 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
12940 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54    { "ro",  SQLIT
12950 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
12960 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
12970 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "rw",  SQLITE_O
12980 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
12990 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
129a0 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50  "rwc", SQLITE_OP
129b0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
129c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
129d0 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
129e0 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c   { "memory", SQL
129f0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20  ITE_OPEN_MEMORY 
12a00 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
12a10 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
12a20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
12a30 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
12a40 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51  EN_READONLY | SQ
12a50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12a60 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ITE.            
12a70 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
12a80 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
12a90 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
12aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
12ab0 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20  e = aOpenMode;. 
12ac0 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
12ad0 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20   mask & flags;. 
12ae0 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
12af0 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20  pe = "access";. 
12b00 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
12b10 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20    if( aMode ){. 
12b20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
12b30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
12b40 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
12b50 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65    for(i=0; aMode
12b60 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20  [i].z; i++){.   
12b70 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
12b80 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69  har *z = aMode[i
12b90 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ].z;.           
12ba0 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74   if( nVal==sqlit
12bb0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26  e3Strlen30(z) &&
12bc0 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c   0==memcmp(zVal,
12bd0 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20   z, nVal) ){.   
12be0 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20             mode 
12bf0 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b  = aMode[i].mode;
12c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
12c10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12c20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
12c30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f            if( mo
12c40 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
12c50 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
12c60 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12c70 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64  ("no such %s mod
12c80 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70  e: %s", zModeTyp
12c90 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
12ca0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12cb0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
12cc0 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
12cd0 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
12ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
12cf0 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49  f( (mode & ~SQLI
12d00 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e  TE_OPEN_MEMORY)>
12d10 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  limit ){.       
12d20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
12d30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12d40 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c  ("%s mode not al
12d50 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20  lowed: %s",.    
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a      zModeType, z
12d90 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
12da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45    rc = SQLITE_PE
12db0 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RM;.            
12dc0 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
12dd0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
12de0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
12df0 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b  = (flags & ~mask
12e00 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  ) | mode;.      
12e10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
12e20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b     zOpt = &zVal[
12e30 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a  nVal+1];.    }..
12e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69    }else{.    zFi
12e50 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
12e60 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20  loc(nUri+2);.   
12e70 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
12e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12e90 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  M;.    memcpy(zF
12ea0 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
12eb0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
12ec0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
12ed0 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
12ee0 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
12ef0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
12f00 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
12f10 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
12f20 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
12f30 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
12f40 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
12f50 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
12f60 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
12f70 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
12f80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12f90 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
12fa0 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
12fb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
12fc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
12fd0 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
12fe0 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
12ff0 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
13000 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
13010 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
13020 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13030 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
13040 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62   opening a datab
13050 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66  ase on behalf of
13060 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
13070 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f  () and sqlite3_o
13080 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74  pen16(). The dat
13090 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22  abase filename "
130a0 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20  zFilename"  .** 
130b0 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  is UTF-8 encoded
130c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
130d0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20  openDatabase(.  
130e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
130f0 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61  ename, /* Databa
13100 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d  se filename UTF-
13110 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73  8 encoded */.  s
13120 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
13130 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
13140 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20  turned database 
13150 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  handle */.  unsi
13160 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20  gned int flags, 
13170 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61     /* Operationa
13180 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  l flags */.  con
13190 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
131a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
131b0 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  he VFS to use */
131c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
131d0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
131e0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61        /* Store a
131f0 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20  llocated handle 
13200 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
13210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
13230 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
13240 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20  t isThreadsafe; 
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13260 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64   True for thread
13270 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  safe connections
13280 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65   */.  char *zOpe
13290 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
132a0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
132b0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  e argument to pa
132c0 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28  ss to BtreeOpen(
132d0 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  ) */.  char *zEr
132e0 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
132f0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
13300 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c  message from sql
13310 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a  ite3ParseUri() *
13320 2f 0a 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  /..  *ppDb = 0;.
13330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13340 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
13350 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
13360 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
13370 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13380 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c  #endif..  /* Onl
13390 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
133a0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
133b0 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
133c0 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
133d0 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
133e0 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
133f0 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
13400 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
13410 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
13420 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
13430 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
13440 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
13450 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
13460 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
13470 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
13480 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
13490 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
134a0 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
134b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
134c0 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
134d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
134e0 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
134f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
13500 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
13510 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  TE.  */.  assert
13520 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
13530 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20  ADONLY  == 0x01 
13540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
13550 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13560 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20  TE == 0x02 );.  
13570 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
13580 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d  PEN_CREATE    ==
13590 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63   0x04 );.  testc
135a0 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
135b0 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20  7))==0x02 ); /* 
135c0 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65  READONLY */.  te
135d0 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
135e0 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20  gs&7))==0x04 ); 
135f0 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a  /* READWRITE */.
13600 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
13610 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30  (flags&7))==0x40
13620 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
13630 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69   | CREATE */.  i
13640 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37  f( ((1<<(flags&7
13650 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20  )) & 0x46)==0 ) 
13660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
13670 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66  SUSE_BKPT;..  if
13680 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
13690 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
136a0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
136b0 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
136c0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
136d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
136e0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
136f0 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
13700 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
13710 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
13720 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
13730 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
13740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
13750 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
13760 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13770 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
13780 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
13790 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
137a0 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66  TECACHE ){.    f
137b0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
137c0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
137d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
137e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
137f0 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
13800 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67  bled ){.    flag
13810 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
13820 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
13830 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68  }..  /* Remove h
13840 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d  armful bits from
13850 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
13860 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  eter.  **.  ** T
13870 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  he SQLITE_OPEN_N
13880 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54  OMUTEX and SQLIT
13890 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
138a0 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a   flags were.  **
138b0 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74   dealt with in t
138c0 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
138d0 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73   block.  Besides
138e0 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79   these, the only
138f0 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75  .  ** valid inpu
13900 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  t flags for sqli
13910 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72  te3_open_v2() ar
13920 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
13930 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c  ADONLY,.  ** SQL
13940 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13950 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
13960 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f  CREATE, SQLITE_O
13970 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c  PEN_SHAREDCACHE,
13980 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
13990 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20  N_PRIVATECACHE, 
139a0 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65  and some reserve
139b0 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c  d bits.  Silentl
139c0 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20  y mask.  ** off 
139d0 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e  all other flags.
139e0 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d  .  */.  flags &=
139f0 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ~( SQLITE_OPEN
13a00 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
13a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
13a30 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
13a40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13a50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20  EN_MAIN_DB |.   
13a60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13a70 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
13a80 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
13a90 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52    SQLITE_OPEN_TR
13aa0 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20  ANSIENT_DB | .  
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
13ac0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
13ad0 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
13ae0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13af0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
13b00 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
13b10 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
13b20 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  UBJOURNAL | .   
13b30 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13b40 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
13b50 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20  OURNAL |.       
13b60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13b70 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20  PEN_NOMUTEX |.  
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
13b90 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
13ba0 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
13bb0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
13bc0 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WAL.            
13bd0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
13be0 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  te the sqlite da
13bf0 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
13c00 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61    db = sqlite3Ma
13c10 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
13c20 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69  (sqlite3) );.  i
13c30 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20  f( db==0 ) goto 
13c40 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66  opendb_out;.  if
13c50 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29  ( isThreadsafe )
13c60 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20  {.    db->mutex 
13c70 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13c80 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13c90 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
13ca0 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d   if( db->mutex==
13cb0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
13cc0 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20  e3_free(db);.   
13cd0 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20     db = 0;.     
13ce0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
13cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
13d00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
13d10 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
13d20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78  db->errMask = 0x
13d30 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ff;.  db->nDb = 
13d40 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
13d50 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
13d60 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
13d70 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a  db->aDbStatic;..
13d80 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13d90 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
13da0 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
13db0 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
13dc0 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
13dd0 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
13de0 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
13df0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
13e00 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
13e10 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a  c = -1;.  db->sz
13e20 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c  Mmap = sqlite3Gl
13e30 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
13e40 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  p;.  db->nextPag
13e50 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
13e60 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
13e70 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c  _ShortColNames |
13e80 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
13e90 69 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43  igger | SQLITE_C
13ea0 61 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64  acheSpill.#if !d
13eb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13ec0 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f  FAULT_AUTOMATIC_
13ed0 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45  INDEX) || SQLITE
13ee0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
13ef0 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20  IC_INDEX.       
13f00 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
13f10 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e  TE_AutoIndex.#en
13f20 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  dif.#if SQLITE_D
13f30 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d  EFAULT_FILE_FORM
13f40 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20  AT<4.           
13f50 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
13f60 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e  egacyFileFmt.#en
13f70 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
13f80 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  E_ENABLE_LOAD_EX
13f90 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  TENSION.        
13fa0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
13fb0 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a  E_LoadExtension.
13fc0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13fd0 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53  E_DEFAULT_RECURS
13fe0 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20  IVE_TRIGGERS.   
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
14000 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65  SQLITE_RecTrigge
14010 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  rs.#endif.#if de
14020 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46  fined(SQLITE_DEF
14030 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  AULT_FOREIGN_KEY
14040 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46  S) && SQLITE_DEF
14050 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  AULT_FOREIGN_KEY
14060 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S.              
14070 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65     | SQLITE_Fore
14080 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20  ignKeys.#endif. 
14090 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33       ;.  sqlite3
140a0 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43  HashInit(&db->aC
140b0 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
140c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
140d0 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
140e0 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
140f0 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
14100 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
14110 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
14120 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
14130 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20  Y. BINARY works 
14140 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20  for both UTF-8. 
14150 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20   ** and UTF-16, 
14160 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e  so add a version
14170 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f   for each to avo
14180 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61  id any unnecessa
14190 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69  ry.  ** conversi
141a0 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72  ons. The only er
141b0 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63  ror that can occ
141c0 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c  ur here is a mal
141d0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20  loc() failure.. 
141e0 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
141f0 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
14200 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  Y", SQLITE_UTF8,
14210 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
14220 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
14230 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
14240 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  RY", SQLITE_UTF1
14250 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6BE, 0, binCollF
14260 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
14270 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
14280 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
14290 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43  UTF16LE, 0, binC
142a0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
142b0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
142c0 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
142d0 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
142e0 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  1, binCollFunc, 
142f0 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
14300 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
14310 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
14320 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66  t;.  }.  db->pDf
14330 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  ltColl = sqlite3
14340 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
14350 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49  SQLITE_UTF8, "BI
14360 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73  NARY", 0);.  ass
14370 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
14380 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  ll!=0 );..  /* A
14390 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20  lso add a UTF-8 
143a0 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
143b0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
143c0 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65  nce. */.  create
143d0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e  Collation(db, "N
143e0 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55  OCASE", SQLITE_U
143f0 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f  TF8, 0, nocaseCo
14400 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
14410 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
14420 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72   filename/URI ar
14430 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d  gument. */.  db-
14440 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61  >openFlags = fla
14450 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  gs;.  rc = sqlit
14460 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c  e3ParseUri(zVfs,
14470 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61   zFilename, &fla
14480 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26  gs, &db->pVfs, &
14490 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29  zOpen, &zErrMsg)
144a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
144b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
144c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
144d0 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  M ) db->mallocFa
144e0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  iled = 1;.    sq
144f0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
14500 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
14510 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
14520 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14530 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
14540 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14550 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
14560 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
14570 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
14580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14590 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
145a0 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
145b0 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
145e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
145f0 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
14600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14610 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14620 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
14630 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14640 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
14650 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
14660 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67  b, rc, 0);.    g
14670 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
14680 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d    }.  db->aDb[0]
14690 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
146a0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
146b0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
146c0 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
146d0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
146e0 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
146f0 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  ...  /* The defa
14700 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  ult safety_level
14710 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
14720 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27  tabase is 'full'
14730 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20  ; for the temp. 
14740 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20   ** database it 
14750 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20  is 'NONE'. This 
14760 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65  matches the page
14770 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73  r layer defaults
14780 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61  .  .  */.  db->a
14790 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d  Db[0].zName = "m
147a0 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  ain";.  db->aDb[
147b0 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  0].safety_level 
147c0 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  = 3;.  db->aDb[1
147d0 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22  ].zName = "temp"
147e0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73  ;.  db->aDb[1].s
147f0 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b  afety_level = 1;
14800 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
14810 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
14820 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  N;.  if( db->mal
14830 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14840 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
14860 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69  ster all built-i
14870 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74  n functions, but
14880 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
14890 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a  to read the.  **
148a0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
148b0 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65   yet. This is de
148c0 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20  layed until the 
148d0 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64  first time the d
148e0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20  atabase.  ** is 
148f0 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  accessed..  */. 
14900 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
14910 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
14920 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
14930 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  erBuiltinFunctio
14940 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  ns(db);..  /* Lo
14950 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
14960 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
14970 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
14980 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
14990 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
149a0 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
149b0 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
149c0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
149d0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
149e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
149f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
14a00 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65  ite3AutoLoadExte
14a10 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20  nsions(db);.    
14a20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
14a30 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66  code(db);.    if
14a40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14a50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  ){.      goto op
14a60 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
14a70 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
14a80 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
14a90 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
14aa0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
14ab0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14ac0 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
14ad0 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
14ae0 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
14af0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
14b00 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14b10 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
14b20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14b30 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
14b40 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
14b50 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
14b60 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
14b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
14b80 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
14b90 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
14ba0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
14bb0 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  3.  if( !db->mal
14bc0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
14bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14be0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
14bf0 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
14c00 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
14c10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
14c20 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
14c30 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
14c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14c50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75   rc = sqlite3Icu
14c60 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
14c70 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
14c80 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
14c90 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
14ca0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
14cb0 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
14cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65  rc = sqlite3Rtre
14cd0 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  eInit(db);.  }.#
14ce0 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
14cf0 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
14d00 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45  ;..  /* -DSQLITE
14d10 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
14d20 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58  _MODE=1 makes EX
14d30 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61  CLUSIVE the defa
14d40 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
14d50 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45   mode.  -DSQLITE
14d60 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
14d70 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52  _MODE=0 make NOR
14d80 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20  MAL the default 
14d90 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
14da0 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e  e.  Doing nothin
14db0 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61  g at all also ma
14dc0 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  kes NORMAL the d
14dd0 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66  efault..  */.#if
14de0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
14df0 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a  LT_LOCKING_MODE.
14e00 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
14e10 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
14e20 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
14e30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
14e40 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69  LockingMode(sqli
14e50 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
14e60 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20  ->aDb[0].pBt),. 
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14e90 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
14ea0 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  MODE);.#endif.. 
14eb0 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
14ec0 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
14ed0 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
14ee0 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
14ef0 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
14f00 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
14f10 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14f30 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14f40 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
14f50 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
14f60 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
14f70 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14f80 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
14f90 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
14fa0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
14fb0 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64  (zOpen);.  if( d
14fc0 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
14fd0 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
14fe0 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
14ff0 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
15000 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
15010 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
15020 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15030 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
15040 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15050 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61  errcode(db);.  a
15060 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20  ssert( db!=0 || 
15070 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
15080 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
15090 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
150a0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
150b0 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b  db);.    db = 0;
150c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21  .  }else if( rc!
150d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
150e0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
150f0 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b  LITE_MAGIC_SICK;
15100 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64  .  }.  *ppDb = d
15110 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  b;.#ifdef SQLITE
15120 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
15130 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
15140 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
15150 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69   ){.    /* Openi
15160 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20  ng a db handle. 
15170 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
15180 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f   is passed 0. */
15190 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
151a0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
151b0 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
151c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
151d0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
151e0 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c  g(pArg, db, zFil
151f0 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  ename, 0);.  }.#
15200 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73  endif.  return s
15210 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
15220 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   rc);.}../*.** O
15230 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
15240 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
15250 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a  t sqlite3_open(.
15260 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
15270 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
15280 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20  te3 **ppDb .){. 
15290 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
152a0 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  base(zFilename, 
152b0 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
152c0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
152d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
152e0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
152f0 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e  CREATE, 0);.}.in
15300 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  t sqlite3_open_v
15310 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2(.  const char 
15320 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  *filename,   /* 
15330 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
15340 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
15350 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
15360 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
15370 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20  QLite db handle 
15380 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
153a0 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  Flags */.  const
153b0 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
153c0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
153d0 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20  S module to use 
153e0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  */.){.  return o
153f0 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65  penDatabase(file
15400 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73  name, ppDb, (uns
15410 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c  igned int)flags,
15420 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64   zVfs);.}..#ifnd
15430 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
15440 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  TF16./*.** Open 
15450 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
15460 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
15470 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20  lite3_open16(.  
15480 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
15490 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
154a0 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68  3 **ppDb.){.  ch
154b0 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e  ar const *zFilen
154c0 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65  ame8;   /* zFile
154d0 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20  name encoded in 
154e0 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66  UTF-8 instead of
154f0 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c   UTF-16 */.  sql
15500 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
15510 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15520 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
15530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70   );.  assert( pp
15540 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20  Db );.  *ppDb = 
15550 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
15560 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
15570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
15580 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
15590 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
155a0 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c  c;.#endif.  pVal
155b0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
155c0 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
155d0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
155e0 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
155f0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
15600 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  IVE, SQLITE_STAT
15610 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  IC);.  zFilename
15620 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  8 = sqlite3Value
15630 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
15640 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a  E_UTF8);.  if( z
15650 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20  Filename8 ){.   
15660 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61   rc = openDataba
15670 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70  se(zFilename8, p
15680 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
15690 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
156a0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
156b0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
156c0 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61  REATE, 0);.    a
156d0 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20  ssert( *ppDb || 
156e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
156f0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
15700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62  SQLITE_OK && !Db
15710 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44  HasProperty(*ppD
15720 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
15730 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20  oaded) ){.      
15740 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
15750 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
15760 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15770 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15780 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c  NOMEM;.  }.  sql
15790 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
157a0 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73  al);..  return s
157b0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
157c0 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   rc);.}.#endif /
157d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
157e0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
157f0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
15800 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15810 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
15820 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
15830 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
15840 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
15850 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
15860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
15870 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
15880 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
15890 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
158a0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
158b0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
158c0 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
158d0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
158e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
158f0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
15900 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15910 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
15920 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
15930 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70  Name, (u8)enc, p
15940 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
15950 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
15960 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
15970 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
15980 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
15990 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
159a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
159b0 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
159c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
159d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
159e0 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
159f0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
15a00 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73  ollation_v2(.  s
15a10 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
15a20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
15a30 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
15a40 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
15a50 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
15a60 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15a70 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15a80 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
15a90 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
15aa0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
15ab0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
15ac0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
15ad0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
15ae0 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
15af0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
15b00 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
15b10 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
15b20 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20  re, xDel);.  rc 
15b30 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
15b40 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
15b50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15b60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
15b70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
15b80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15b90 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
15ba0 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
15bb0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
15bc0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
15bd0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
15be0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
15bf0 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20  _collation16(.  
15c00 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
15c10 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
15c20 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  e,.  int enc, . 
15c30 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
15c40 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
15c50 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15c60 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15c70 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
15c80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15c90 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20  char *zName8;.  
15ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15cb0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
15cc0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
15cd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
15ce0 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65   zName8 = sqlite
15cf0 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e  3Utf16to8(db, zN
15d00 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
15d10 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
15d20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20  if( zName8 ){.  
15d30 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
15d40 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
15d50 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  8, (u8)enc, pCtx
15d60 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
15d70 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15d80 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20  e(db, zName8);. 
15d90 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
15da0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
15db0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
15dc0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
15dd0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
15de0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15df0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
15e00 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
15e10 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
15e20 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
15e30 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
15e40 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15e50 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
15e60 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
15e70 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
15e80 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
15e90 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
15ea0 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
15eb0 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20  eded(.  sqlite3 
15ec0 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
15ed0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
15ee0 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
15ef0 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  ed)(void*,sqlite
15f00 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
15f10 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
15f20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15f30 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
15f40 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
15f50 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  ded = xCollNeede
15f60 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  d;.  db->xCollNe
15f70 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62  eded16 = 0;.  db
15f80 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
15f90 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
15fa0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
15fb0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
15fc0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
15fd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
15fe0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ff0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
16000 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
16010 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
16020 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
16030 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
16040 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
16050 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
16060 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
16070 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
16080 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
16090 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
160a0 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c  _needed16(.  sql
160b0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
160c0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
160d0 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
160e0 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a  lNeeded16)(void*
160f0 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
16100 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69  extRep,const voi
16110 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  d*).){.  sqlite3
16120 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16130 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
16140 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a  CollNeeded = 0;.
16150 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
16160 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  d16 = xCollNeede
16170 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  d16;.  db->pColl
16180 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
16190 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
161a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
161b0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
161c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
161d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
161e0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
161f0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
16200 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
16210 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ED./*.** This fu
16220 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
16230 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
16240 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
16250 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
16260 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
16270 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
16280 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
16290 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
162a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
162b0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
162c0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
162d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
162e0 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
162f0 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
16300 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
16310 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
16320 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
16330 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
16340 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
16350 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
16360 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
16370 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
16380 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
16390 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
163a0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
163b0 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
163c0 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
163d0 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
163e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
163f0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
16400 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
16410 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
16420 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ommit;.}../*.** 
16430 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
16440 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69  utines are subti
16450 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61  tutes for consta
16460 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  nts SQLITE_CORRU
16470 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  PT,.** SQLITE_MI
16480 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  SUSE, SQLITE_CAN
16490 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f  TOPEN, SQLITE_IO
164a0 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ERR and possibly
164b0 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
164c0 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79  constants.  They
164d0 20 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70   server two purp
164e0 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  oses:.**.**   1.
164f0 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e    Serve as a con
16500 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
16510 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
16520 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a  t in a debugger.
16530 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65  **       to dete
16540 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20  ct when version 
16550 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
16560 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20   occurs..**.**  
16570 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69   2.  Invoke sqli
16580 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f  te3_log() to pro
16590 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20  vide the source 
165a0 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68  code location wh
165b0 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c  ere.**       a l
165c0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69  ow-level error i
165d0 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
165e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
165f0 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
16600 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
16610 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
16620 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
16630 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
16640 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  og(SQLITE_CORRUP
16650 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
16660 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75   "database corru
16670 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64  ption at line %d
16680 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
16690 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
166a0 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
166b0 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
166c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
166d0 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  UPT;.}.int sqlit
166e0 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
166f0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
16700 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
16710 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
16720 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
16730 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  log(SQLITE_MISUS
16740 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
16750 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e    "misuse at lin
16760 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
16770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16780 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
16790 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
167a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
167b0 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71  MISUSE;.}.int sq
167c0 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72  lite3CantopenErr
167d0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
167e0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
167f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16800 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
16810 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
16820 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20  CANTOPEN, .     
16830 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
16840 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69   open file at li
16850 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
16860 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16870 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
16880 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
16890 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
168a0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23  _CANTOPEN;.}...#
168b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
168c0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
168d0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
168e0 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
168f0 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
16900 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
16910 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
16920 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
16930 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
16940 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
16950 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
16960 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
16970 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
16980 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
16990 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
169a0 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
169b0 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
169c0 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
169d0 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
169e0 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
169f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16a00 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
16a10 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
16a20 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
16a30 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
16a40 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
16a50 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
16a60 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
16a70 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
16a80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16a90 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
16aa0 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33  DATA.int sqlite3
16ab0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
16ac0 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65  tadata(.  sqlite
16ad0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
16ae0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
16af0 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ion handle */.  
16b00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
16b10 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44  ame,        /* D
16b20 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20  atabase name or 
16b30 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
16b40 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
16b50 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e  ,     /* Table n
16b60 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
16b70 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  har *zColumnName
16b80 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ,    /* Column n
16b90 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ame */.  char co
16ba0 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65  nst **pzDataType
16bb0 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20  ,    /* OUTPUT: 
16bc0 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79  Declared data ty
16bd0 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  pe */.  char con
16be0 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20  st **pzCollSeq, 
16bf0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43      /* OUTPUT: C
16c00 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16c10 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
16c20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20  *pNotNull,      
16c30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
16c40 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e  T: True if NOT N
16c50 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ULL constraint e
16c60 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  xists */.  int *
16c70 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20  pPrimaryKey,    
16c80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
16c90 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
16ca0 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20   part of PK */. 
16cb0 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20   int *pAutoinc  
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16cd0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
16ce0 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69  column is auto-i
16cf0 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  ncrement */.){. 
16d00 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
16d10 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
16d20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
16d30 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20  .  Column *pCol 
16d40 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  = 0;.  int iCol;
16d50 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ..  char const *
16d60 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20  zDataType = 0;. 
16d70 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
16d80 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74  llSeq = 0;.  int
16d90 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20   notnull = 0;.  
16da0 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d  int primarykey =
16db0 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e   0;.  int autoin
16dc0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73  c = 0;..  /* Ens
16dd0 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
16de0 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e   schema has been
16df0 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c   loaded */.  sql
16e00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16e10 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
16e20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16e30 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  All(db);.  rc = 
16e40 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20  sqlite3Init(db, 
16e50 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
16e60 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
16e70 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  {.    goto error
16e80 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
16e90 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
16ea0 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a   in question */.
16eb0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
16ec0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
16ed0 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  ableName, zDbNam
16ee0 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20  e);.  if( !pTab 
16ef0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
16f00 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30   ){.    pTab = 0
16f10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ;.    goto error
16f20 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
16f30 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Find the column 
16f40 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69  for which info i
16f50 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  s requested */. 
16f60 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f   if( sqlite3IsRo
16f70 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  wid(zColumnName)
16f80 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
16f90 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
16fa0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
16fb0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
16fc0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
16fd0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
16fe0 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
16ff0 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
17000 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43  Col++){.      pC
17010 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
17020 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iCol];.      if
17030 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
17040 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
17050 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b   zColumnName) ){
17060 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17080 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62    if( iCol==pTab
17090 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
170a0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
170b0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
170c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
170d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
170e0 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d  ock stores the m
170f0 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
17100 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
17110 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68  urned.  ** to th
17120 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61  e caller in loca
17130 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74  l variables zDat
17140 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c  aType, zCollSeq,
17150 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72   notnull, primar
17160 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75  ykey.  ** and au
17170 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70  toinc. At this p
17180 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74  oint there are t
17190 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  wo possibilities
171a0 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
171b0 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65   1. The specifie
171c0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61  d column name wa
171d0 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20  s rowid", "oid" 
171e0 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20  or "_rowid_" .  
171f0 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68  **        and th
17200 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63  ere is no explic
17210 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50  itly declared IP
17220 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a  K column. .  **.
17230 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20    **     2. The 
17240 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76  table is not a v
17250 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  iew and the colu
17260 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69  mn name identifi
17270 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20  ed an .  **     
17280 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65     explicitly de
17290 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43  clared column. C
172a0 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  opy meta informa
172b0 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e  tion from *pCol.
172c0 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f  .  */ .  if( pCo
172d0 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  l ){.    zDataTy
172e0 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  pe = pCol->zType
172f0 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  ;.    zCollSeq =
17300 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20   pCol->zColl;.  
17310 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c    notnull = pCol
17320 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20  ->notNull!=0;.  
17330 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20    primarykey  = 
17340 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20  (pCol->colFlags 
17350 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
17360 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69  Y)!=0;.    autoi
17370 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  nc = pTab->iPKey
17380 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d  ==iCol && (pTab-
17390 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
173a0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
173b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
173c0 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45  DataType = "INTE
173d0 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72  GER";.    primar
173e0 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ykey = 1;.  }.  
173f0 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b  if( !zCollSeq ){
17400 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
17410 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65  "BINARY";.  }..e
17420 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
17430 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
17440 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74  (db);..  /* Whet
17450 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  her the function
17460 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20   call succeeded 
17470 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74  or failed, set t
17480 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
17490 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61  ters.  ** to wha
174a0 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61  tever their loca
174b0 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63  l counterparts c
174c0 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72  ontain. If an er
174d0 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20  ror did occur,. 
174e0 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65   ** this has the
174f0 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69   effect of zeroi
17500 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61  ng all output pa
17510 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
17520 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20   if( pzDataType 
17530 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20  ) *pzDataType = 
17540 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28  zDataType;.  if(
17550 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a   pzCollSeq ) *pz
17560 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53  CollSeq = zCollS
17570 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75  eq;.  if( pNotNu
17580 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d  ll ) *pNotNull =
17590 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20   notnull;.  if( 
175a0 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70  pPrimaryKey ) *p
175b0 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69  PrimaryKey = pri
175c0 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70  marykey;.  if( p
175d0 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f  Autoinc ) *pAuto
175e0 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a  inc = autoinc;..
175f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
17600 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a  =rc && !pTab ){.
17610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17620 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
17630 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
17640 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
17650 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20   "no such table 
17660 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20  column: %s.%s", 
17670 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20  zTableName,.    
17680 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29      zColumnName)
17690 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
176a0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  E_ERROR;.  }.  s
176b0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
176c0 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73  rc, (zErrMsg?"%s
176d0 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  ":0), zErrMsg);.
176e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
176f0 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
17700 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
17710 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
17720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17730 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
17740 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
17750 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ndif../*.** Slee
17760 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
17770 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
17780 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
17790 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
177a0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74  qlite3_sleep(int
177b0 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   ms){.  sqlite3_
177c0 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74  vfs *pVfs;.  int
177d0 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71   rc;.  pVfs = sq
177e0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
177f0 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30  );.  if( pVfs==0
17800 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
17810 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
17820 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73   works in millis
17830 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20  econds, but the 
17840 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65  underlying OsSle
17850 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75  ep() .  ** API u
17860 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  ses microseconds
17870 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30  . Hence the 1000
17880 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  's..  */.  rc = 
17890 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28  (sqlite3OsSleep(
178a0 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31  pVfs, 1000*ms)/1
178b0 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  000);.  return r
178c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  c;.}../*.** Enab
178d0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
178e0 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c  e extended resul
178f0 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t codes..*/.int 
17900 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
17910 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71  _result_codes(sq
17920 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
17930 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33  noff){.  sqlite3
17940 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
17950 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
17960 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
17970 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
17980 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
17990 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
179a0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
179b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
179c0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
179d0 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
179e0 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
179f0 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
17a00 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
17a10 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
17a20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
17a30 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
17a40 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
17a50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17a60 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
17a70 2a 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69  *pBtree;..  sqli
17a80 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17a90 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42  db->mutex);.  pB
17aa0 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  tree = sqlite3Db
17ab0 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
17ac0 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
17ad0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61  pBtree ){.    Pa
17ae0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
17af0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
17b00 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  d;.    sqlite3Bt
17b10 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
17b20 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
17b30 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
17b40 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73  (pBtree);.    as
17b50 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
17b60 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69  );.    fd = sqli
17b70 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
17b80 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
17b90 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( fd!=0 );.    i
17ba0 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
17bb0 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
17bc0 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
17bd0 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
17be0 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  = fd;.      rc =
17bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17c00 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d  }else if( fd->pM
17c10 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
17c20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
17c30 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70  leControl(fd, op
17c40 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c  , pArg);.    }el
17c50 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
17c60 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
17c70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17c80 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
17c90 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ee);.  }.  sqlit
17ca0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
17cb0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
17cc0 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a  urn rc;   .}../*
17cd0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
17ce0 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67   the testing log
17cf0 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ic..*/.int sqlit
17d00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
17d10 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
17d20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e  int rc = 0;.#ifn
17d30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17d40 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76  BUILTIN_TEST.  v
17d50 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
17d60 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
17d70 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
17d80 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61      /*.    ** Sa
17d90 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ve the current s
17da0 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
17db0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17dc0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
17dd0 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20  L_PRNG_SAVE: {. 
17de0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
17df0 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20  SaveState();.   
17e00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17e10 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
17e20 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65  estore the state
17e30 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20   of the PRNG to 
17e40 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73  the last state s
17e50 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  aved using.    *
17e60 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66  * PRNG_SAVE.  If
17e70 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e   PRNG_SAVE has n
17e80 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
17e90 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20   called, then.  
17ea0 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61    ** this verb a
17eb0 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45  cts like PRNG_RE
17ec0 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  SET..    */.    
17ed0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
17ee0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
17ef0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
17f00 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61  e3PrngRestoreSta
17f10 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
17f20 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
17f30 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68  .    ** Reset th
17f40 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69  e PRNG back to i
17f50 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ts uninitialized
17f60 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78   state.  The nex
17f70 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
17f80 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
17f90 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65  ess() will resee
17fa0 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67  d the PRNG using
17fb0 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20   a single call. 
17fc0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61     ** to the xRa
17fd0 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20  ndomness method 
17fe0 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  of the default V
17ff0 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  FS..    */.    c
18000 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
18010 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20  TRL_PRNG_RESET: 
18020 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
18030 72 6e 67 52 65 73 65 74 53 74 61 74 65 28 29 3b  rngResetState();
18040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18050 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
18060 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
18070 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f  _control(BITVEC_
18080 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67  TEST, size, prog
18090 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ram).    **.    
180a0 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67  ** Run a test ag
180b0 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f  ainst a Bitvec o
180c0 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20  bject of size.  
180d0 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75  The program argu
180e0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61  ment.    ** is a
180f0 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
18100 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73  ers that defines
18110 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75   the test.  Retu
18120 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a  rn -1 on a.    *
18130 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
18140 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20  ion error, 0 on 
18150 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d  success, or non-
18160 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f  zero for an erro
18170 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68  r..    ** See th
18180 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  e sqlite3BitvecB
18190 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72  uiltinTest() for
181a0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
181b0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
181c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
181d0 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f  TESTCTRL_BITVEC_
181e0 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEST: {.      in
181f0 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
18200 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
18210 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72  t *aProg = va_ar
18220 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
18230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
18240 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
18250 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20  (sz, aProg);.   
18260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18270 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
18280 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
18290 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c  trol(BENIGN_MALL
182a0 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e  OC_HOOKS, xBegin
182b0 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20  , xEnd).    **. 
182c0 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68     ** Register h
182d0 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20  ooks to call to 
182e0 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d  indicate which m
182f0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73  alloc() failures
18300 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e   .    ** are ben
18310 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ign..    */.    
18320 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18330 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c  CTRL_BENIGN_MALL
18340 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20  OC_HOOKS: {.    
18350 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
18360 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28  *void_function)(
18370 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69  void);.      voi
18380 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
18390 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76  gnBegin;.      v
183a0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
183b0 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78  nignEnd;.      x
183c0 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61  BenignBegin = va
183d0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
183e0 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78  nction);.      x
183f0 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61  BenignEnd = va_a
18400 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
18410 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  tion);.      sql
18420 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  ite3BenignMalloc
18430 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67  Hooks(xBenignBeg
18440 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b  in, xBenignEnd);
18450 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18460 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
18470 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
18480 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
18490 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
184a0 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20  _BYTE, unsigned 
184b0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
184c0 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e    ** Set the PEN
184d0 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65  DING byte to the
184e0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72   value in the ar
184f0 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a  gument, if X>0..
18500 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63      ** Make no c
18510 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20  hanges if X==0. 
18520 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
18530 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  e of the pending
18540 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20   byte.    ** as 
18550 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f  it existing befo
18560 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
18570 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
18580 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54  **.    ** IMPORT
18590 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74  ANT:  Changing t
185a0 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
185b0 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20  from 0x40000000 
185c0 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a  results in.    *
185d0 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  * an incompatibl
185e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
185f0 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e  format.  Changin
18600 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
18610 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  te.    ** while 
18620 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e  any database con
18630 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  nection is open 
18640 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66  results in undef
18650 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ined and.    ** 
18660 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61  dileterious beha
18670 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vior..    */.   
18680 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18690 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
186a0 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  TE: {.      rc =
186b0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23   PENDING_BYTE;.#
186c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
186d0 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20  IT_WSD.      {. 
186e0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
186f0 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f  int newVal = va_
18700 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
18710 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69   int);.        i
18720 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69  f( newVal ) sqli
18730 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d  te3PendingByte =
18740 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d   newVal;.      }
18750 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
18760 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
18770 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
18780 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
18790 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
187a0 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20  ASSERT, int X). 
187b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
187c0 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
187d0 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
187e0 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
187f0 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61   or not.    ** a
18800 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62  ssert() was enab
18810 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
18820 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  ime.  If X is tr
18830 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a  ue and assert().
18840 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65      ** is enable
18850 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
18860 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65  rn value is true
18870 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
18880 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  and.    ** asser
18890 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
188a0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
188b0 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20   value is zero. 
188c0 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20   If X is.    ** 
188d0 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
188e0 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  () is enabled, t
188f0 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f  hen the assertio
18900 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a  n fires and the.
18910 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
18920 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20  borts.  If X is 
18930 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
18940 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
18950 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
18960 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
18970 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
18980 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18990 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a  TCTRL_ASSERT: {.
189a0 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69        volatile i
189b0 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
189c0 61 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f  assert( (x = va_
189d0 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20  arg(ap,int))!=0 
189e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b  );.      rc = x;
189f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18a00 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
18a10 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
18a20 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
18a30 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
18a40 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
18a50 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
18a60 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
18a70 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
18a80 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59  ee how the ALWAY
18a90 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56  S and.    ** NEV
18aa0 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64  ER macros were d
18ab0 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  efined at compil
18ac0 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20  e-time..    **. 
18ad0 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e     ** The return
18ae0 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53   value is ALWAYS
18af0 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  (X).  .    **.  
18b00 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65    ** The recomme
18b10 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d  nded test is X==
18b20 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  2.  If the retur
18b30 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68  n value is 2, th
18b40 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  at means.    ** 
18b50 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
18b60 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f  ER() are both no
18b70 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
18b80 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69   macros, which i
18b90 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  s the.    ** def
18ba0 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49  ault setting.  I
18bb0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
18bc0 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c  ue is 1, then AL
18bd0 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72  WAYS() is either
18be0 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64  .    ** hard-cod
18bf0 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c  ed to true or el
18c00 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66  se it asserts if
18c10 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73   its argument is
18c20 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54   false..    ** T
18c30 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f  he first behavio
18c40 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  r (hard-coded to
18c50 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61   true) is the ca
18c60 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
18c70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
18c80 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
18c90 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
18ca0 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f  led and the seco
18cb0 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69  nd.    ** behavi
18cc0 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68  or (assert if th
18cd0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c  e argument to AL
18ce0 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29  WAYS() is false)
18cf0 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
18d00 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
18d10 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
18d20 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
18d30 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  ) is enabled..  
18d40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
18d50 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72  run-time test pr
18d60 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f  ocedure might lo
18d70 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ok something lik
18d80 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
18d90 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c     **    if( sql
18da0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
18db0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
18dc0 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20  L_ALWAYS, 2)==2 
18dd0 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
18de0 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  / ALWAYS() and N
18df0 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70  EVER() are no-op
18e00 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
18e10 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d  cros.    **    }
18e20 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
18e30 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
18e40 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
18e50 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20  SERT, 1) ){.    
18e60 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
18e70 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61  S(x) asserts tha
18e80 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56  t x is true. NEV
18e90 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20  ER(x) asserts x 
18ea0 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
18eb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a      }else{.    *
18ec0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
18ed0 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
18ee0 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69  t 1.  NEVER(x) i
18ef0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a  s a constant 0..
18f00 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20      **    }.    
18f10 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
18f20 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
18f30 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  YS: {.      int 
18f40 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
18f50 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41  t);.      rc = A
18f60 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20  LWAYS(x);.      
18f70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
18f80 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
18f90 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
18fa0 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
18fb0 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  RVE, sqlite3 *db
18fc0 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
18fd0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e      ** Set the n
18fe0 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20  Reserve size to 
18ff0 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  N for the main d
19000 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64  atabase on the d
19010 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63  atabase.    ** c
19020 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20  onnection db..  
19030 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
19040 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
19050 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  SERVE: {.      s
19060 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
19070 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
19080 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
19090 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
190a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
190b0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
190c0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
190d0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
190e0 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
190f0 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20  pBt, 0, x, 0);. 
19100 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
19110 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
19120 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
19130 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19140 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19150 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
19160 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
19170 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ONS, sqlite3 *db
19180 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
19190 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72      ** Enable or
191a0 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73   disable various
191b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66   optimizations f
191c0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
191d0 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a  ses.  The .    *
191e0 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20  * argument N is 
191f0 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
19200 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65  imizations to be
19210 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20   disabled.  For 
19220 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70  normal.    ** op
19230 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64  eration N should
19240 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61   be 0.  The idea
19250 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20   is that a test 
19260 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68  program (like th
19270 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67  e.    ** SQL Log
19280 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74  ic Test or SLT t
19290 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20  est module) can 
192a0 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c  run the same SQL
192b0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a   multiple times.
192c0 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69      ** with vari
192d0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
192e0 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65  s disabled to ve
192f0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61  rify that the sa
19300 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a  me answer.    **
19310 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20   is obtained in 
19320 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20  every case..    
19330 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
19340 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
19350 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  MIZATIONS: {.   
19360 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
19370 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
19380 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
19390 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75  >dbOptFlags = (u
193a0 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69  16)(va_arg(ap, i
193b0 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20  nt) & 0xffff);. 
193c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
193d0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
193e0 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f  _N_KEYWORD.    /
193f0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
19400 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19410 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
19420 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
19430 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ord).    **.    
19440 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61  ** If zWord is a
19450 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69   keyword recogni
19460 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  zed by the parse
19470 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  r, then return t
19480 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
19490 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f   of keywords.  O
194a0 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f  r if zWord is no
194b0 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74  t a keyword, ret
194c0 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20  urn 0..    ** . 
194d0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
194e0 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20  feature is only 
194f0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
19500 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69   amalgamation si
19510 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  nce.    ** the S
19520 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
19530 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66  macro is not def
19540 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
19550 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20  e if SQLite.    
19560 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e  ** is built usin
19570 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63  g separate sourc
19580 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
19590 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
195a0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
195b0 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RD: {.      cons
195c0 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  t char *zWord = 
195d0 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
195e0 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69   char*);.      i
195f0 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
19600 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20  rlen30(zWord);. 
19610 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74       rc = (sqlit
19620 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75  e3KeywordCode((u
19630 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b  8*)zWord, n)!=TK
19640 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f  _ID) ? SQLITE_N_
19650 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20  KEYWORD : 0;.   
19660 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19670 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20  #endif ..    /* 
19680 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19690 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
196a0 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
196b0 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70  OC, sz, &pNew, p
196c0 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  Free);.    **.  
196d0 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20    ** Pass pFree 
196e0 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61  into sqlite3Scra
196f0 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20  tchFree(). .    
19700 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20  ** If sz>0 then 
19710 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74  allocate a scrat
19720 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70  ch buffer into p
19730 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  New.  .    */.  
19740 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19750 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
19760 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f  LLOC: {.      vo
19770 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e  id *pFree, **ppN
19780 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  ew;.      int sz
19790 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f  ;.      sz = va_
197a0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
197b0 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61      ppNew = va_a
197c0 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a  rg(ap, void**);.
197d0 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61        pFree = va
197e0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
197f0 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20  .      if( sz ) 
19800 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  *ppNew = sqlite3
19810 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a  ScratchMalloc(sz
19820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19830 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65  ScratchFree(pFre
19840 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
19850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
19860 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19870 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
19880 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
19890 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66  FAULT, int onoff
198a0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
198b0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
198c0 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
198d0 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   configure the w
198e0 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20  rappers so that 
198f0 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  all.    ** subse
19900 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
19910 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76  ocaltime() and v
19920 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66  ariants fail. If
19930 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a   onoff is zero,.
19940 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73      ** undo this
19950 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
19960 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19970 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
19980 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
19990 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
199a0 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d  Config.bLocaltim
199b0 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28  eFault = va_arg(
199c0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
199d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
199e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
199f0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
19a00 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73  LAIN).    /*   s
19a10 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19a20 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19a30 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54  TRL_EXPLAIN_STMT
19a40 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ,.    **        
19a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a60 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f  sqlite3_stmt*,co
19a70 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20  nst char**);.   
19a80 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f   **.    ** If co
19a90 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
19aa0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
19ab0 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71 6c  XPLAIN, each sql
19ac0 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a  ite3_stmt holds.
19ad0 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20      ** a string 
19ae0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
19af0 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61 72  he optimized par
19b00 73 65 20 74 72 65 65 2e 20 20 54 68 69 73 20 74  se tree.  This t
19b10 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20  est-control.    
19b20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
19b30 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72  nter to that str
19b40 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
19b50 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
19b60 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d  CTRL_EXPLAIN_STM
19b70 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
19b80 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
19b90 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
19ba0 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20  te3_stmt*);.    
19bb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
19bc0 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61 70  zRet = va_arg(ap
19bd0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b  , const char**);
19be0 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d 20  .      *pzRet = 
19bf0 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
19c00 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70 53  nation((Vdbe*)pS
19c10 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tmt);.      brea
19c20 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
19c30 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
19c40 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
19c50 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
19c60 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
19c70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
19c80 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
19c90 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
19ca0 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
19cb0 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
19cc0 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
19cd0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
19ce0 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
19cf0 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
19d00 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
19d10 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
19d20 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
19d30 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
19d40 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
19d50 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
19d60 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
19d70 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
19d80 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
19d90 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
19da0 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
19db0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
19dc0 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
19dd0 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
19de0 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
19df0 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
19e00 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
19e10 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
19e20 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
19e30 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
19e40 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
19e50 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
19e60 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
19e70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
19e80 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
19e90 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
19ea0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
19eb0 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
19ec0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
19ed0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
19ee0 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
19ef0 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  lename==0 ) retu
19f00 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  rn 0;.  zFilenam
19f10 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
19f20 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
19f30 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46  + 1;.  while( zF
19f40 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
19f50 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70    int x = strcmp
19f60 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
19f70 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  am);.    zFilena
19f80 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
19f90 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
19fa0 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d   + 1;.    if( x=
19fb0 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c  =0 ) return zFil
19fc0 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65  ename;.    zFile
19fd0 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
19fe0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
19ff0 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65  e) + 1;.  }.  re
1a000 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1a010 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61   Return a boolea
1a020 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  n value for a qu
1a030 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1a040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72  /.int sqlite3_ur
1a050 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  i_boolean(const 
1a060 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1a070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1a080 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b  ram, int bDflt){
1a090 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a0a0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1a0b0 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1a0c0 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62  me, zParam);.  b
1a0d0 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b  Dflt = bDflt!=0;
1a0e0 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71  .  return z ? sq
1a0f0 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
1a100 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c  z, bDflt) : bDfl
1a110 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
1a120 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  rn a 64-bit inte
1a130 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ger value for a 
1a140 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1a150 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1a160 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  4 sqlite3_uri_in
1a170 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  t64(.  const cha
1a180 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1a190 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20   /* Filename as 
1a1a0 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20  passed to xOpen 
1a1b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1a1c0 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f  *zParam,       /
1a1d0 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20  * URI parameter 
1a1e0 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69  sought */.  sqli
1a1f0 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20  te3_int64 bDflt 
1a200 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
1a210 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  if parameter is 
1a220 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  missing */.){.  
1a230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1a240 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1a250 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1a260 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69   zParam);.  sqli
1a270 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69  te3_int64 v;.  i
1a280 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 41  f( z && sqlite3A
1a290 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20 73 71 6c  toi64(z, &v, sql
1a2a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
1a2b0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3d 3d 53   SQLITE_UTF8)==S
1a2c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a2d0 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1a2e0 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1a2f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1a300 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1a310 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1a320 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1a330 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1a340 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1a350 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1a360 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1a370 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1a380 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1a390 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1a3a0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1a3b0 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1a3c0 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
1a3d0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
1a3e0 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
1a3f0 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
1a400 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1a410 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44     return db->aD
1a420 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a  b[i].pBt;.    }.
1a430 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a450 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
1a460 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1a470 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
1a480 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1a490 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
1a4a0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
1a4b0 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
1a4c0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1a4d0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1a4e0 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69  tree *pBt = sqli
1a4f0 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1a500 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1a510 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1a520 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
1a530 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
1a540 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a550 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
1a560 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
1a570 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
1a580 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
1a590 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
1a5a0 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
1a5b0 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1a5c0 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
1a5d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a5e0 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1a5f0 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1a600 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1a610 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1a620 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 50  n pBt ? sqlite3P
1a630 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 73  agerIsreadonly(s
1a640 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1a650 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a 7d 0a     (pBt)) : -1;.}.