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

Artifact 6bc7cd1b896a47f2803f69a56737191abf76918a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1110: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
1120: 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  nt bRunExtraInit
1130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1150: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
1160: 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ion needed */.#e
1170: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1180: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
11a0: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
11b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d0: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
11e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
11f0: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
1200: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
1210: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
1220: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
1230: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1240: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
1250: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
1260: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1270: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
1280: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
1290: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
12a0: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
12b0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
12c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
12f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1300: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1310: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1320: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
1330: 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ed.  If unable t
1340: 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  o .  ** initiali
1350: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
1360: 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65  system, return e
1370: 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72  arly with the er
1380: 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ror..  ** If the
1390: 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69   system is so si
13a0: 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75  ck that we are u
13b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13c0: 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20  e a mutex,.  ** 
13d0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  there is not muc
13e0: 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e  h SQLite is goin
13f0: 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  g to be able to 
1400: 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  do..  **.  ** Th
1410: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
1420: 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65  m must take care
1430: 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20   of serializing 
1440: 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69  its own.  ** ini
1450: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  tialization..  *
1460: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1470: 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69  MutexInit();.  i
1480: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1490: 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  c;..  /* Initial
14a0: 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29  ize the malloc()
14b0: 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20   system and the 
14c0: 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d  recursive pInitM
14d0: 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a  utex mutex..  **
14e0: 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
14f0: 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1500: 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45  the STATIC_MASTE
1510: 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74  R mutex.  Note t
1520: 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c  hat.  ** MutexAl
1530: 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20  loc() is called 
1540: 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74  for a static mut
1550: 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74  ex prior to init
1560: 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a  ializing the.  *
1570: 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  * malloc subsyst
1580: 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65  em - this implie
1590: 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  s that the alloc
15a0: 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69  ation of a stati
15b0: 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73  c.  ** mutex mus
15c0: 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75  t not require su
15d0: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d  pport from the m
15e0: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e  alloc subsystem.
15f0: 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  .  */.  MUTEX_LO
1600: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
1610: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1620: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1630: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
1640: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1650: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
1660: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1670: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
1680: 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71  t = 1;.  if( !sq
1690: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
16b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16c0: 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a  e3MallocInit();.
16d0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1700: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1710: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71  = 1;.    if( !sq
1720: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1730: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1750: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1760: 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20  utex =.         
1770: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c    sqlite3MutexAl
1780: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1790: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
17a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
17b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
17c0: 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65  Mutex && !sqlite
17d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
17e0: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
17f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1800: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1810: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1830: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1840: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1850: 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73  Mutex++;.  }.  s
1860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1870: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
1880: 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20  /* If rc is not 
1890: 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69  SQLITE_OK at thi
18a0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69  s point, then ei
18b0: 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a  ther the malloc.
18c0: 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63    ** subsystem c
18d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74  ould not be init
18e0: 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73  ialized or the s
18f0: 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20  ystem failed to 
1900: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68  allocate.  ** th
1910: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1920: 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  ex. Return an er
1930: 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61  ror in either ca
1940: 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  se.  */.  if( rc
1950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1960: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1970: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72  }..  /* Do the r
1980: 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69  est of the initi
1990: 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20  alization under 
19a0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75  the recursive mu
19b0: 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  tex so.  ** that
19c0: 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65   we will be able
19d0: 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72   to handle recur
19e0: 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a  sive calls into.
19f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1a00: 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20  tialize().  The 
1a10: 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1a20: 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68  normally come th
1a30: 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74  rough.  ** sqlit
1a40: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65  e3_os_init() whe
1a50: 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c  n it invokes sql
1a60: 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1a70: 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20  r(), but other. 
1a80: 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61   ** recursive ca
1a90: 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  lls might also b
1aa0: 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a  e possible..  **
1ab0: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
1ac0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30  TION-OF: R-00140
1ad0: 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75  -37445 SQLite au
1ae0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69  tomatically seri
1af0: 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a  alizes calls.  *
1b00: 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d  * to the xInit m
1b10: 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49  ethod, so the xI
1b20: 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20  nit method need 
1b30: 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66  not be threadsaf
1b40: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
1b50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78   following mutex
1b60: 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69   is what seriali
1b70: 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68  zes access to th
1b80: 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20  e appdef pcache 
1b90: 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f  xInit.  ** metho
1ba0: 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ds.  The sqlite3
1bb0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e  _pcache_methods.
1bc0: 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65  xInit() all is e
1bd0: 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20  mbedded in the. 
1be0: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
1bf0: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c00: 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  ize()..  */.  sq
1c10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c20: 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  r(sqlite3GlobalC
1c30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1c40: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1c50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1c60: 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  nit==0 && sqlite
1c70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1c80: 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20  Progress==0 ){. 
1c90: 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a     FuncDefHash *
1ca0: 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28  pHash = &GLOBAL(
1cb0: 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c  FuncDefHash, sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
1cd0: 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ons);.    sqlite
1ce0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1cf0: 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  Progress = 1;.  
1d00: 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20    memset(pHash, 
1d10: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
1d20: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1d30: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ));.    sqlite3R
1d40: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
1d50: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66  ctions();.    if
1d60: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1d70: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
1d80: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
1da0: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
1db0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1de0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1df0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
1e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e  rc = sqlite3OsIn
1e10: 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  it();.    }.    
1e20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e30: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e40: 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65  e3PCacheBufferSe
1e50: 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  tup( sqlite3Glob
1e60: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20  alConfig.pPage, 
1e70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
1e90: 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c  zPage, sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
1eb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1ed0: 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  nit = 1;.#ifdef 
1ee0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
1ef0: 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74 72  T.      bRunExtr
1f00: 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69  aInit = 1;.#endi
1f10: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
1f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f30: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
1f40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1f50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1f70: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
1f80: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
1f90: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
1fa0: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
1fb0: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
1fc0: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
1fd0: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
1fe0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ff0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
2000: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
2010: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2020: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
2030: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2040: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
2050: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
2060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
2070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
2080: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
2090: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20a0: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
20b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
20c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
20d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
20e0: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
20f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2100: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
2110: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
2120: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
2130: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
2140: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
2150: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
2160: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
2170: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
2180: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
2190: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
21a0: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
21b0: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
21c0: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
21d0: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
21e0: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
21f0: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
2200: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2210: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
2220: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
2230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2240: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
2250: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
2260: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
2270: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
2280: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2290: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
22a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22b0: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
22c0: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
22d0: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
22e0: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
22f0: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
2300: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
2310: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
2320: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
2330: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2340: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
2350: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
2360: 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69  .  /* Do extra i
2370: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74  nitialization st
2380: 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79  eps requested by
2390: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52   the SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70  A_INIT.  ** comp
23b0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
23c0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
23d0: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
23e0: 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e   if( bRunExtraIn
23f0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2400: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2410: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
2420: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58    rc = SQLITE_EX
2430: 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d  TRA_INIT(0);.  }
2440: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2450: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
2460: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
2470: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
2480: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
2490: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
24a0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
24b0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
24c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
24d0: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
24e0: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
24f0: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2500: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2510: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2520: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
2530: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
2540: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
2550: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
2560: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
2570: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
2580: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
2590: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
25a0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
25b0: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
25c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25d0: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
25e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
25f0: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2600: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2610: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2620: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2630: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2640: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2650: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2660: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
2670: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
2680: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
2690: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
26a0: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
26b0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
26c0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
26d0: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
26e0: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
26f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2700: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2720: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2730: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2740: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2750: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2760: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2770: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2780: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2790: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27a0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
27b0: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
27c0: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
27d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27e0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
27f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2800: 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44  _OMIT_SHUTDOWN_D
2810: 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f  IRECTORIES.    /
2820: 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73 79  * The heap subsy
2830: 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65  stem has now bee
2840: 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74  n shutdown and t
2850: 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20  hese values are 
2860: 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20  supposed.    ** 
2870: 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  to be NULL or po
2880: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  int to memory th
2890: 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  at was obtained 
28a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
28b0: 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68  loc(),.    ** wh
28c0: 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f  ich would rely o
28d0: 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62 73  n that heap subs
28e0: 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65  ystem; therefore
28f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73  , make sure thes
2900: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2910: 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  cannot refer to 
2920: 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74  heap memory that
2930: 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69   was just invali
2940: 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20  dated when the. 
2950: 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79     ** heap subsy
2960: 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77  stem was shutdow
2970: 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  n.  This is only
2980: 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72   done if the cur
2990: 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  rent call to.   
29a0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
29b0: 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68  n resulted in th
29c0: 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  e heap subsystem
29d0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
29e0: 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f  shutdown..    */
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74  .    sqlite3_dat
2a00: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
2a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d  .    sqlite3_tem
2a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
2a30: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2a50: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2a60: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2a70: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
2a80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2a90: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2aa0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
2ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ac0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
2ad0: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
2ae0: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
2af0: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
2b00: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
2b10: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2b20: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
2b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b40: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2b50: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
2b60: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
2b70: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
2b80: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2b90: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2ba0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2bb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
2bc0: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
2bd0: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
2be0: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
2bf0: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
2c00: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
2c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
2c20: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
2c30: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2c40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c50: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
2c60: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
2c70: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
2c80: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
2c90: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
2ca0: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
2cb0: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
2cc0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
2cd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2ce0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
2cf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
2d00: 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  T;..  va_start(a
2d10: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
2d20: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
2d30: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
2d40: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
2d50: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
2d60: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
2d70: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a     ** compile. .
2d80: 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e      */.#if defin
2d90: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
2da0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
2db0: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20 20 20  THREADSAFE>0.   
2dc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2dd0: 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
2de0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2df0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
2e00: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
2e10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2e20: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20  CoreMutex = 0;. 
2e30: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e40: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2e50: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2e60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2e80: 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20  IG_MULTITHREAD: 
2e90: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
2ea0: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64  le mutexing of d
2eb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2ec0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ons */.      /* 
2ed0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  Enable mutexing 
2ee0: 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72  of core data str
2ef0: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20  uctures */.     
2f00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f10: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f20: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f40: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f60: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f70: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
2f80: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
2f90: 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  Enable all mutex
2fa0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2fb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fc0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2fe0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ff0: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
3000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3020: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
3030: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
3040: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
3050: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
3060: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
3070: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3080: 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28  mutex = *va_arg(
3090: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
30a0: 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  x_methods*);.   
30b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30d0: 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a  CONFIG_GETMUTEX:
30e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
30f0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
3100: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
3110: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a  ation */.      *
3120: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3130: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
3140: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3150: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a  alConfig.mutex;.
3160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3170: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
3180: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3190: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
31a0: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
31b0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c   alternative mal
31c0: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
31d0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
31e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
31f0: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3200: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3210: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
3220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3230: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3240: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
3250: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3260: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c  the current mall
3270: 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74  oc() implementat
3280: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ion */.      if(
3290: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32a0: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d  nfig.m.xMalloc==
32b0: 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  0 ) sqlite3MemSe
32c0: 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20  tDefault();.    
32d0: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
32e0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
32f0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
3300: 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20  balConfig.m;.   
3310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3320: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3330: 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53  CONFIG_MEMSTATUS
3340: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
3350: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
3360: 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73  he malloc status
3370: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20   collection */. 
3380: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3390: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
33a0: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
33b0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
33c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
33d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
33e0: 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20  CRATCH: {.      
33f0: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
3400: 75 66 66 65 72 20 66 6f 72 20 73 63 72 61 74 63  uffer for scratc
3410: 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  h memory space *
3420: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
3440: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
3450: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3460: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3470: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
3480: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
34a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61  obalConfig.nScra
34b0: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
34c0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
34d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
34e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34f0: 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20  _PAGECACHE: {.  
3500: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3510: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 70 61   a buffer for pa
3520: 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 20  ge cache memory 
3530: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
3540: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3550: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
3560: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3570: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3580: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
3590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
35a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
35b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
35c0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
35d0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
35e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
35f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3600: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
3610: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
3620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3630: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3640: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a  ONFIG_GETPCACHE:
3650: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20   {.      /* now 
3660: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
3670: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3680: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
3690: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
36a0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
36b0: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
36c0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
36d0: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
36e0: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
36f0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3700: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3710: 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f  g.pcache2 = *va_
3720: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3730: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a  pcache_methods2*
3740: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3750: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3760: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3770: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
3780: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3790: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
37a0: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
37b0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
37c0: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
37d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
37e0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37f0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
3800: 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  2*) = sqlite3Glo
3810: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
3820: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
3830: 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
3840: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
3850: 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66  _MEMSYS3) || def
3860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
3870: 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20  LE_MEMSYS5).    
3880: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3890: 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20  IG_HEAP: {.     
38a0: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
38b0: 62 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20  buffer for heap 
38c0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
38d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
38e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
38f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3900: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3910: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3920: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
3930: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3940: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3950: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
3960: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
3970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
3980: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
3990: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
39a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
39b0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
39c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
39d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
39e0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
39f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
3a00: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
3a10: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
3a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3a30: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3a40: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
3a50: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3a70: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
3a80: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65      /* If the he
3a90: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55  ap pointer is NU
3aa0: 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65  LL, then restore
3ab0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c   the malloc impl
3ac0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
3ad0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55     ** back to NU
3ae0: 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e  LL pointers too.
3af0: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
3b00: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20  e the malloc to 
3b10: 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  go.        ** ba
3b20: 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  ck to its defaul
3b30: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
3b40: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
3b50: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20  itialize() is.  
3b60: 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20        ** run..  
3b70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3b80: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
3b90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
3ba0: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
3bb0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
3bc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68          /* The h
3be0: 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  eap pointer is n
3bf0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  ot NULL, then in
3c00: 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65  stall one of the
3c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35  .        ** mem5
3c20: 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64  .c/mem3.c method
3c30: 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73 69 6e  s.  The enclosin
3c40: 67 20 23 69 66 20 67 75 61 72 61 6e 74 65 65 73  g #if guarantees
3c50: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
3c60: 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 73  east one of thes
3c70: 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63 75 72  e methods is cur
3c80: 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64 2e 0a  rently enabled..
3c90: 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
3ca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3cb0: 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20  MEMSYS3.        
3cc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3cd0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
3ce0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b  MemGetMemsys3();
3cf0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3d00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
3d10: 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c  SYS5.        sql
3d20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3d30: 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d  .m = *sqlite3Mem
3d40: 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65  GetMemsys5();.#e
3d50: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
3d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
3d80: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
3d90: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
3da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3db0: 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
3dc0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3dd0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3de0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3df0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
3e00: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3e20: 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f      .    /* Reco
3e30: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
3e40: 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74  the logger funct
3e50: 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73  ion and its firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
3e70: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  ** The default i
3e80: 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67  s NULL.  Logging
3e90: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20   is disabled if 
3ea0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  the function poi
3eb0: 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e  nter is.    ** N
3ec0: 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20  IG_LOG: {.      
3ef0: 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
3f00: 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
3f10: 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
3f20: 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
3f30: 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
3f40: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
3f50: 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
3f60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3f70: 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72  fig.xLog = va_ar
3f80: 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f  g(ap, void(*)(vo
3f90: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3fa0: 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  ar*));.      */.
3fb0: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
3fc0: 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76  id(*LOGFUNC_t)(v
3fd0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
3fe0: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  har*);.      sql
3ff0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4000: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
4010: 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20  p, LOGFUNC_t);. 
4020: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4030: 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67  alConfig.pLogArg
4040: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
4050: 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  id*);.      brea
4060: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
4070: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4080: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71  _URI: {.      sq
4090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
40a0: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
40b0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
40c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
40f0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
4100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4110: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
4120: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
4130: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4140: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
4150: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
4160: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
4170: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
4180: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
4190: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
41a0: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
41b0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
41c0: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
41d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
41e0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
41f0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
4200: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4210: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4220: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
4230: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4240: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
4250: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4260: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4270: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
4280: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4290: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
42a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
42b0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
42c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
42d0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
42e0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
42f0: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  4);.      if( mx
4300: 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70  Mmap<0 || mxMmap
4310: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50  >SQLITE_MAX_MMAP
4320: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
4330: 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   mxMmap = SQLITE
4340: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a  _MAX_MMAP_SIZE;.
4350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4360: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4370: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
4380: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  p;.      if( szM
4390: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
43a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
43b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
43c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
43d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
43e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
43f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
4400: 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
4410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4420: 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
4430: 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64  S_WIN && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
4450: 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65 20 53  LLOC).    case S
4460: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
4470: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
4480: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4490: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
44a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
44b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
44c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
44d0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
44e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
44f0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
4500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
4510: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
4520: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4530: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
4540: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
4550: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4560: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
4570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4580: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
4590: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
45a0: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
45b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
45c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
45d0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
45e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
45f0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
4600: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
4610: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
4620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
4630: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
4640: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
4650: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
4660: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
4670: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4680: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4690: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
46a0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
46b0: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
46c0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
46d0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
46e0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
46f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
4700: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
4710: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
4720: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
4730: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
4740: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
4750: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4760: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4770: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4780: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
4790: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
47a0: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
47b0: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
47c0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
47d0: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
47e0: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
47f0: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
4800: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
4810: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
4820: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4830: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
4840: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
4850: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4860: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4870: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4880: 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65  kaside slot afte
4890: 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65  r ROUNDDOWN8 nee
48a0: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ds to be larger.
48b0: 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e    ** than a poin
48c0: 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c  ter to be useful
48d0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f  ..  */.  sz = RO
48e0: 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f  UNDDOWN8(sz);  /
48f0: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
4900: 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a  9382 */.  if( sz
4910: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
4920: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
4930: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4940: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4950: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4960: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4970: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4980: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4990: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
49a0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
49b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
49c0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
49d0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
49e0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
49f0: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
4a00: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4a10: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
4a20: 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20   pStart ) cnt = 
4a30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
4a40: 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20  e(pStart)/sz;.  
4a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72  }else{.    pStar
4a60: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
4a70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
4a80: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
4a90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4aa0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
4ab0: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
4ac0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
4ad0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
4ae0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
4af0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
4b00: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
4b10: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
4b20: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
4b30: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4b40: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
4b50: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
4b60: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
4b70: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
4b80: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
4b90: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4ba0: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
4bb0: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4bc0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
4bd0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
4be0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4bf0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
4c00: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
4c10: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
4c20: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4c30: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
4c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
4c50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4c60: 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  art = db;.    db
4c70: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4c80: 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c   = db;.    db->l
4c90: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4ca0: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4cb0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4cc0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
4cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4cf0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
4d00: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
4d10: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4d20: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
4d30: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
4d40: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
4d50: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
4d60: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
4d70: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
4d80: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
4d90: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
4da0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
4db0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
4dc0: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
4dd0: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
4de0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4df0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4e00: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4e10: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
4e20: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
4e30: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4e40: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
4e50: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
4e60: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
4e70: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
4e80: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
4e90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4ea0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
4eb0: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
4ec0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
4ed0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
4ee0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
4ef0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4f00: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
4f10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4f20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
4f30: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
4f40: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
4f50: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
4f60: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
4f70: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
4f80: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
4f90: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
4fa0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
4fb0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
4fc0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
4fd0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
4fe0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
4ff0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
5000: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
5010: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
5020: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
5030: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
5040: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
5050: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
5060: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
5070: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
5080: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
5090: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
50a0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
50b0: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
50c0: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
50d0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
50e0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
50f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5100: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5110: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5120: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
5130: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
5140: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
5150: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
5160: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
5170: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
5180: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
5190: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
51a0: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
51b0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
51c0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
51d0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
51e0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
51f0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
5200: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
5210: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
5220: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
5230: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
5240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5250: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
5260: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
5270: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
5280: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
5290: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
52a0: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
52b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
52c0: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
52d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
52e0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
52f0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
5300: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
5310: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
5320: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
5330: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
5340: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
5350: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
5360: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
5370: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
5380: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
5390: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
53a0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
53b0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
53c0: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
53d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
53e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
53f0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
5400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5410: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
5420: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
5430: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
5440: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5450: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
5460: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
5470: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
5480: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
5490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
54a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
54b0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
54c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
54d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
54e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
54f0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5500: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
5510: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
5520: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
5530: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
5540: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
5550: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
5560: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
5570: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
5580: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
5590: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
55a0: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
55b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
55c0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
55d0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
55e0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
55f0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
5600: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
5610: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
5620: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
5630: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
5640: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
5650: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
5660: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
5670: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
5680: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
5690: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
56a0: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
56b0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
56c0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
56d0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
56e0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
56f0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
5700: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
5710: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
5720: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
5730: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
5740: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
5750: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5760: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
5770: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
5780: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
5790: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
57a0: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
57b0: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
57c0: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
57d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
57e0: 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74   rc unchanged at
57f0: 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   0 */.    }else{
5800: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
5810: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
5820: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
5840: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
5850: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
5860: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
5870: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
5880: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
5890: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
58a0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
58b0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
58c0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
58d0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
58e0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
58f0: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
5900: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
5910: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
5920: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
5930: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
5940: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
5950: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
5960: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
5970: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
5980: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
5990: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
59a0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
59b0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
59c0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
59d0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
59e0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
59f0: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
5a00: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
5a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
5a20: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
5a30: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
5a40: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
5a50: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
5a60: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
5a70: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
5a80: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
5a90: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
5aa0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
5ab0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
5ac0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5ad0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
5ae0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
5af0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5b00: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
5b10: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
5b20: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
5b30: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5b40: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
5b50: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5b60: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
5b70: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
5b80: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5b90: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5ba0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
5bb0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
5bc0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5bd0: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
5be0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
5bf0: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
5c00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5c10: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
5c20: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5c30: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
5c40: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5c50: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
5c60: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
5c70: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
5c80: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
5c90: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5ca0: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
5cb0: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
5cc0: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
5cd0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
5ce0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
5cf0: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
5d00: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
5d10: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5d20: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5d30: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
5d40: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
5d50: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
5d60: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
5d70: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
5d80: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
5d90: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
5da0: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
5db0: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
5dc0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
5dd0: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
5de0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
5df0: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
5e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5e10: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
5e20: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
5e30: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
5e40: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
5e50: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
5e60: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
5e70: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
5e80: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
5e90: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
5ea0: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
5eb0: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
5ec0: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
5ed0: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
5ee0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
5ef0: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
5f00: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
5f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f20: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
5f30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
5f40: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
5f50: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
5f60: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
5f70: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
5f80: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
5f90: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
5fa0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
5fb0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
5fc0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
5fd0: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
5fe0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
5ff0: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
6000: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6010: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
6020: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
6030: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
6040: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61   all sqlite3_vta
6050: 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62  b objects that b
6060: 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73  elong to databas
6070: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
6080: 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  db. This is call
6090: 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65  ed when db is be
60a0: 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  ing closed..*/.s
60b0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f  tatic void disco
60c0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c  nnectAllVtab(sql
60d0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64  ite3 *db){.#ifnd
60e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
60f0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
6100: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t i;.  sqlite3Bt
6110: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6120: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6130: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6140: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6150: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
6160: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
6170: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
6180: 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  a ){.      HashE
6190: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  lem *p;.      fo
61a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
61b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
61c0: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
61d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
61e0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
61f0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
6200: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
6210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
6220: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
6230: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
6240: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
6250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6260: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
6270: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
6280: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6290: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c  eaveAll(db);.#el
62a0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
62b0: 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69  METER(db);.#endi
62c0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
62d0: 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61  n TRUE if databa
62e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
62f0: 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64   has unfinalized
6300: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6310: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6320: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6330: 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a  ckup objects.  .
6340: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
6350: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73  nnectionIsBusy(s
6360: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
6370: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
6380: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6390: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
63a0: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
63b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
63c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
63d0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; j++){.    Btr
63e0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
63f0: 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[j].pBt;.    if
6400: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6410: 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28  BtreeIsInBackup(
6420: 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  pBt) ) return 1;
6430: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6450: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
6460: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73  te database.*/.s
6470: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6480: 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  3Close(sqlite3 *
6490: 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d  db, int forceZom
64a0: 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20  bie){.  if( !db 
64b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
64c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
64d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
64e0: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
64f0: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
6500: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6510: 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
6520: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
6530: 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  b->mutex);..  /*
6540: 20 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e 65   Force xDisconne
6550: 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20  ct calls on all 
6560: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
6570: 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  /.  disconnectAl
6580: 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a  lVtab(db);..  /*
6590: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
65a0: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 64  n is open, the d
65b0: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
65c0: 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20  () call above.  
65d0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65  ** will not have
65e0: 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73   called the xDis
65f0: 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  connect() method
6600: 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a   on any virtual.
6610: 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74    ** tables in t
6620: 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d  he db->aVTrans[]
6630: 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c   array. The foll
6640: 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61  owing sqlite3Vta
6650: 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a  bRollback().  **
6660: 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f   call will do so
6670: 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20  . We need to do 
6680: 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20  this before the 
6690: 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65  check for active
66a0: 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
66b0: 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74  ents below, as t
66c0: 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65  he v-table imple
66d0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65  mentation may be
66e0: 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f   storing.  ** so
66f0: 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  me prepared stat
6700: 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c  ements internall
6710: 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
6720: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
6730: 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20  );..  /* Legacy 
6740: 62 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74 65  behavior (sqlite
6750: 33 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76 69  3_close() behavi
6760: 6f 72 29 20 69 73 20 74 6f 20 72 65 74 75 72 6e  or) is to return
6770: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  .  ** SQLITE_BUS
6780: 59 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  Y if the connect
6790: 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 63  ion can not be c
67a0: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
67b0: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 66  y..  */.  if( !f
67c0: 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f  orceZombie && co
67d0: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
67e0: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
67f0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
6800: 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20  E_BUSY, "unable 
6810: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
6820: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20  unfinalized ".  
6830: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
6840: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62   or unfinished b
6850: 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71  ackups");.    sq
6860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6870: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
6880: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6890: 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  BUSY;.  }..#ifde
68a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
68b0: 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
68c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
68d0: 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
68e0: 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68  /* Closing the h
68f0: 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
6900: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
6910: 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a  d the value 2. *
6920: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  /.    sqlite3Glo
6930: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
6940: 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g(sqlite3GlobalC
6950: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
6960: 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d  , db, 0, 2);.  }
6970: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
6980: 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63  nvert the connec
6990: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62  tion into a zomb
69a0: 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73  ie and then clos
69b0: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d  e it..  */.  db-
69c0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
69d0: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20  MAGIC_ZOMBIE;.  
69e0: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
69f0: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
6a00: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
6a10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6a20: 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73  * Two variations
6a30: 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69   on the public i
6a40: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f  nterface for clo
6a50: 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  sing a database.
6a60: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  ** connection. T
6a70: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
6a80: 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72  () version retur
6a90: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ns SQLITE_BUSY a
6aa0: 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65  nd.** leaves the
6ab0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69   connection opti
6ac0: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
6ad0: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70  unfinalized prep
6ae0: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
6af0: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
6b00: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73   sqlite3_backups
6b10: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  .  The sqlite3_c
6b20: 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72  lose_v2().** ver
6b30: 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20  sion forces the 
6b40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
6b50: 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66  come a zombie if
6b60: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e   there are.** un
6b70: 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73  closed resources
6b80: 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66  , and arranges f
6b90: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  or deallocation 
6ba0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a  when the last.**
6bb0: 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
6bc0: 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  nt or sqlite3_ba
6bd0: 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a  ckup closes..*/.
6be0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
6bf0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  e(sqlite3 *db){ 
6c00: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
6c10: 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74  ose(db,0); }.int
6c20: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6c30: 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  2(sqlite3 *db){ 
6c40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
6c50: 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f  ose(db,1); }.../
6c60: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d  *.** Close the m
6c70: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
6c80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
6c90: 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  **.** Furthermor
6ca0: 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63  e, if database c
6cb0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
6cc0: 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e  a zombie (meanin
6cd0: 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  g that there.** 
6ce0: 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72  has been a prior
6cf0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
6d00: 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71  _close(db) or sq
6d10: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64  lite3_close_v2(d
6d20: 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79  b)) and.** every
6d30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61   sqlite3_stmt ha
6d40: 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c  s now been final
6d50: 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73  ized and every s
6d60: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61  qlite3_backup ha
6d70: 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74  s.** finished, t
6d80: 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73  hen free all res
6d90: 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ources..*/.void 
6da0: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
6db0: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
6dc0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6dd0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
6e00: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
6e10: 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  j;..  /* If ther
6e20: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
6e30: 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  g sqlite3_stmt o
6e40: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
6e50: 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72   objects.  ** or
6e60: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
6e70: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  on has not yet b
6e80: 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71  een closed by sq
6e90: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
6ea0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74  ,.  ** then just
6eb0: 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78   leave the mutex
6ec0: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
6ed0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  /.  if( db->magi
6ee0: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
6ef0: 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63  ZOMBIE || connec
6f00: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
6f10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
6f20: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6f30: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
6f40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
6f50: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
6f60: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
6f70: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
6f80: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20  onnection has.  
6f90: 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71  ** closed all sq
6fa0: 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73  lite3_stmt and s
6fb0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
6fc0: 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65  jects and has be
6fd0: 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74  en.  ** passed t
6fe0: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20  o sqlite3_close 
6ff0: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74  (meaning that it
7000: 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20   is a zombie).  
7010: 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20  Therefore,.  ** 
7020: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65  go ahead and fre
7030: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
7040: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  .  */..  /* If a
7050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7060: 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61  open, roll it ba
7070: 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e  ck. This also en
7080: 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20  sures that if.  
7090: 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  ** any database 
70a0: 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65  schemas have bee
70b0: 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e  n modified by an
70c0: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61   uncommitted tra
70d0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68  nsaction.  ** th
70e0: 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e  ey are reset. An
70f0: 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69  d that the requi
7100: 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
7110: 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65   is held to make
7120: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20  .  ** the pager 
7130: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
7140: 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f  ema reset an ato
7150: 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a  mic operation. *
7160: 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  /.  sqlite3Rollb
7170: 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
7180: 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  E_OK);..  /* Fre
7190: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
71a0: 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  g Savepoint stru
71b0: 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctures. */.  sql
71c0: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
71d0: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  nts(db);..  /* C
71e0: 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73  lose all databas
71f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
7200: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
7210: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
7220: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
7230: 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20  = &db->aDb[j];. 
7240: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
7250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7260: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
7270: 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  pBt);.      pDb-
7280: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >pBt = 0;.      
7290: 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20  if( j!=1 ){.    
72a0: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
72b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
72c0: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65    }.  }.  /* Cle
72d0: 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65  ar the TEMP sche
72e0: 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e  ma separately an
72f0: 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20  d last */.  if( 
7300: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
7310: 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ma ){.    sqlite
7320: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d  3SchemaClear(db-
7330: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
7340: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
7350: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
7360: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70  );..  /* Free up
7370: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75   the array of au
7380: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
7390: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f  s */.  sqlite3Co
73a0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
73b0: 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ray(db);.  asser
73c0: 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b  t( db->nDb<=2 );
73d0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
73e0: 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db==db->aDbStati
73f0: 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20  c );..  /* Tell 
7400: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
7410: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
7420: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
7430: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
7440: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
7450: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
7460: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
7470: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
7480: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
7490: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
74a0: 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  (db);..  for(j=0
74b0: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62  ; j<ArraySize(db
74c0: 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29  ->aFunc.a); j++)
74d0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
74e0: 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70  Next, *pHash, *p
74f0: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e  ;.    for(p=db->
7500: 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70  aFunc.a[j]; p; p
7510: 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70  =pHash){.      p
7520: 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b  Hash = p->pHash;
7530: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
7540: 29 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74  ){.        funct
7550: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
7560: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
7570: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
7580: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7590: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
75a0: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
75b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
75c0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
75d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
75e0: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
75f0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
7600: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
7610: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
7620: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
7630: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
7640: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
7650: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
7660: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7670: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
7680: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
7690: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
76a0: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
76b0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
76c0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
76d0: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
76e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
76f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7700: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
7710: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
7720: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
7730: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7740: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
7750: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
7760: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
7770: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
7780: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
7790: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
77a0: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
77b0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
77c0: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
77d0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
77e0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
77f0: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
7800: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
7810: 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ree(db, pMod);. 
7820: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
7830: 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75  Clear(&db->aModu
7840: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  le);.#endif..  s
7850: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
7860: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f  SQLITE_OK, 0); /
7870: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
7880: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
7890: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
78a0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
78b0: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
78c0: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
78d0: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
78e0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
78f0: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
7900: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
7910: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
7920: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
7930: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
7940: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
7950: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
7960: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
7970: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
7980: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
7990: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
79a0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
79b0: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
79c0: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
79d0: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
79e0: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
79f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
7a00: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
7a10: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
7a20: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
7a30: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
7a40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7a50: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
7a60: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
7a70: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7a80: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
7a90: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
7aa0: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
7ab0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
7ac0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
7ad0: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
7ae0: 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f  de.nOut==0 );  /
7af0: 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f  * Fails on a loo
7b00: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65  kaside memory le
7b10: 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ak */.  if( db->
7b20: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
7b30: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
7b40: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
7b50: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
7b60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
7b70: 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(db);.}../*.** 
7b80: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
7b90: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66  abase files.  If
7ba0: 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
7bb0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
7bc0: 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  .** any open cur
7bd0: 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
7be0: 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20  ated ("tripped" 
7bf0: 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e  - as in "trippin
7c00: 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62  g a circuit.** b
7c10: 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64  reaker") and mad
7c20: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70  e to return trip
7c30: 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72  Code if there ar
7c40: 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a  e any further.**
7c50: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65   attempts to use
7c60: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f   that cursor..*/
7c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
7c80: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
7c90: 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f   *db, int tripCo
7ca0: 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  de){.  int i;.  
7cb0: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
7cc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7cd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
7ce0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
7cf0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
7d00: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20  Malloc();..  /* 
7d10: 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65  Obtain all b-tre
7d20: 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65  e mutexes before
7d30: 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c   making any call
7d40: 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61  s to BtreeRollba
7d50: 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73  ck(). .  ** This
7d60: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
7d70: 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
7d80: 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c  ction being roll
7d90: 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a  ed back has.  **
7da0: 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
7db0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
7dc0: 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  f the b-tree mut
7dd0: 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b  exes are not tak
7de0: 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68  en.  ** here, th
7df0: 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65  en another share
7e00: 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69  d-cache connecti
7e10: 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  on might sneak i
7e20: 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  n between.  ** t
7e30: 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c  he database roll
7e40: 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20  back and schema 
7e50: 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e  reset, which can
7e60: 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a   cause false.  *
7e70: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70  * corruption rep
7e80: 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73  orts in some cas
7e90: 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  es.  */.  sqlite
7ea0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
7eb0: 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  b);..  for(i=0; 
7ec0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7ed0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
7ee0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
7ef0: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
7f00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
7f10: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
7f20: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
7f30: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
7f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7f50: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72  eeRollback(p, tr
7f60: 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  ipCode);.    }. 
7f70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
7f80: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
7f90: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
7fa0: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
7fb0: 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
7fc0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
7fd0: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
7fe0: 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
7ff0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
8000: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
8010: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
8020: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
8030: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
8040: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
8050: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
8060: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
8070: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
8080: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
8090: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
80a0: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
80b0: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
80c0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
80d0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
80e0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
80f0: 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a  _DeferFKs;..  /*
8100: 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e   If one has been
8110: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76   configured, inv
8120: 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  oke the rollback
8130: 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  -hook callback *
8140: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c  /.  if( db->xRol
8150: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26  lbackCallback &&
8160: 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62   (inTrans || !db
8170: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b  ->autoCommit) ){
8180: 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  .    db->xRollba
8190: 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  ckCallback(db->p
81a0: 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20  RollbackArg);.  
81b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
81c0: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
81d0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
81e0: 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64   name correspond
81f0: 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ing to the error
8200: 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69   code.** specifi
8210: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
8220: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  nt..*/.#if (defi
8230: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
8240: 29 20 26 26 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) && SQLITE_OS_W
8250: 49 4e 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  IN) || defined(S
8260: 51 4c 49 54 45 5f 54 45 53 54 29 0a 63 6f 6e 73  QLITE_TEST).cons
8270: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
8280: 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a  rrName(int rc){.
8290: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
82a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
82b0: 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20  , origRc = rc;. 
82c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26   for(i=0; i<2 &&
82d0: 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20   zName==0; i++, 
82e0: 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20  rc &= 0xff){.   
82f0: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
8300: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8310: 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20  _OK:            
8320: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8330: 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20  LITE_OK";       
8340: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8350: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8360: 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20  E_ERROR:        
8370: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8380: 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20  QLITE_ERROR";   
8390: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
83a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
83b0: 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20  TE_INTERNAL:    
83c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
83d0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22  SQLITE_INTERNAL"
83e0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
83f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8400: 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20  ITE_PERM:       
8410: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8420: 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20  "SQLITE_PERM";  
8430: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8440: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8450: 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20  LITE_ABORT:     
8460: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8470: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b   "SQLITE_ABORT";
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8490: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
84a0: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
84b0: 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20  BACK:     zName 
84c0: 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  = "SQLITE_ABORT_
84d0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72  ROLLBACK";    br
84e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
84f0: 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20  SQLITE_BUSY:    
8500: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8510: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22   = "SQLITE_BUSY"
8520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
8530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8540: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43   SQLITE_BUSY_REC
8550: 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d  OVERY:      zNam
8560: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
8570: 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20  _RECOVERY";     
8580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8590: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  e SQLITE_BUSY_SN
85a0: 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61  APSHOT:      zNa
85b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
85c0: 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20  Y_SNAPSHOT";    
85d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
85e0: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
85f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
8600: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
8610: 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20  CKED";          
8620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8630: 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ase SQLITE_LOCKE
8640: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a  D_SHAREDCACHE: z
8650: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c  Name = "SQLITE_L
8660: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
8670: 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  E";break;.      
8680: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
8690: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
86a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
86b0: 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20  NOMEM";         
86c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
86d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
86e0: 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20  DONLY:          
86f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8700: 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20  _READONLY";     
8710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
8730: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a  ADONLY_RECOVERY:
8740: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8750: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
8760: 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERY"; break;.   
8770: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
8780: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
8790: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
87a0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
87b0: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
87c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
87d0: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
87e0: 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  K:  zName = "SQL
87f0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
8800: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
8810: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8820: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
8830: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
8840: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
8850: 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a  MOVED";  break;.
8860: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8870: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
8880: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8890: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
88a0: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
88b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
88c0: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20  TE_IOERR:       
88d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
88e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
88f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8900: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8910: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
8920: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8930: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  "SQLITE_IOERR_RE
8940: 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AD";        brea
8950: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8960: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
8970: 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  _READ:   zName =
8980: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
8990: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
89a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
89b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
89c0: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
89d0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
89e0: 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72  WRITE";       br
89f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8a00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
8a10: 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  NC:        zName
8a20: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8a30: 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62  _FSYNC";       b
8a40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8a50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
8a60: 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d  R_FSYNC:    zNam
8a70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8a80: 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20  R_DIR_FSYNC";   
8a90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8aa0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
8ab0: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61  RUNCATE:     zNa
8ac0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8ad0: 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20  RR_TRUNCATE";   
8ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8af0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8b00: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e  FSTAT:        zN
8b10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8b20: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
8b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8b40: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8b50: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _UNLOCK:       z
8b60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8b70: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
8b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8b90: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8ba0: 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_RDLOCK:       
8bb0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8bc0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20  IOERR_RDLOCK";  
8bd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8be0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8bf0: 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20  RR_DELETE:      
8c00: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8c10: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20  _IOERR_DELETE"; 
8c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8c30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8c40: 45 52 52 5f 42 4c 4f 43 4b 45 44 3a 20 20 20 20  ERR_BLOCKED:    
8c50: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8c60: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 22  E_IOERR_BLOCKED"
8c70: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8c80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8c90: 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  OERR_NOMEM:     
8ca0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8cb0: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b  TE_IOERR_NOMEM";
8cc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8cd0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8ce0: 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20  IOERR_ACCESS:   
8cf0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8d00: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
8d10: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8d20: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8d30: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
8d40: 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  RVEDLOCK:.      
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8d70: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8d80: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
8d90: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
8da0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8db0: 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20  RR_LOCK:        
8dc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8dd0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20  _IOERR_LOCK";   
8de0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8df0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8e00: 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20  ERR_CLOSE:      
8e10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8e20: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20  E_IOERR_CLOSE"; 
8e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8e50: 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20  OERR_DIR_CLOSE: 
8e60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8e70: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
8e80: 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  SE";   break;.  
8e90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8ea0: 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20  IOERR_SHMOPEN:  
8eb0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8ec0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
8ed0: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
8ee0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8ef0: 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20  _IOERR_SHMSIZE: 
8f00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8f10: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
8f20: 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ZE";     break;.
8f30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8f40: 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a  E_IOERR_SHMLOCK:
8f50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8f60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
8f70: 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  OCK";     break;
8f80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8f90: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a  TE_IOERR_SHMMAP:
8fa0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8fb0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
8fc0: 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b  MAP";      break
8fd0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8fe0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20  ITE_IOERR_SEEK: 
8ff0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9000: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  "SQLITE_IOERR_SE
9010: 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  EK";        brea
9020: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9030: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
9040: 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d  E_NOENT: zName =
9050: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
9060: 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65  ELETE_NOENT";bre
9070: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9080: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
9090: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
90a0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
90b0: 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72  MMAP";        br
90c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
90d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
90e0: 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65  TEMPPATH:  zName
90f0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
9100: 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62  _GETTEMPPATH"; b
9110: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9120: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f   SQLITE_IOERR_CO
9130: 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d  NVPATH:     zNam
9140: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
9150: 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20  R_CONVPATH";    
9160: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9170: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
9180: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  :            zNa
9190: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
91a0: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20  RUPT";          
91b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
91c0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
91d0: 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e  T_VTAB:       zN
91e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
91f0: 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20  RRUPT_VTAB";    
9200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9210: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  ase SQLITE_NOTFO
9220: 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a  UND:           z
9230: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9240: 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20  OTFOUND";       
9250: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9260: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c  case SQLITE_FULL
9270: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
9280: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9290: 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20  FULL";          
92a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
92b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
92c0: 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20  TOPEN:          
92d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
92e0: 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20  _CANTOPEN";     
92f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9300: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
9310: 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52  NTOPEN_NOTEMPDIR
9320: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
9330: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
9340: 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20  PDIR";break;.   
9350: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9360: 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20  ANTOPEN_ISDIR:  
9370: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9380: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
9390: 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  R";    break;.  
93a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
93b0: 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
93c0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
93d0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
93e0: 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  LPATH"; break;. 
93f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9400: 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
9410: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
9420: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
9430: 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  NVPATH"; break;.
9440: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9450: 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20  E_PROTOCOL:     
9460: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9470: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b  QLITE_PROTOCOL";
9480: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9490: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
94a0: 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20  TE_EMPTY:       
94b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
94c0: 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20  SQLITE_EMPTY";  
94d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
94e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
94f0: 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20  ITE_SCHEMA:     
9500: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9510: 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b  "SQLITE_SCHEMA";
9520: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9530: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9540: 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20  LITE_TOOBIG:    
9550: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9560: 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22   "SQLITE_TOOBIG"
9570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
9580: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9590: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
95a0: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
95b0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
95c0: 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72  AINT";        br
95d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
95e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
95f0: 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65  T_UNIQUE:  zName
9600: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
9610: 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62  RAINT_UNIQUE"; b
9620: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9630: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9640: 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d  NT_TRIGGER: zNam
9650: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
9660: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b  TRAINT_TRIGGER";
9670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9680: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9690: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a  INT_FOREIGNKEY:.
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
96d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
96e0: 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b  GNKEY";   break;
96f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9700: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48  TE_CONSTRAINT_CH
9710: 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  ECK:   zName = "
9720: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9730: 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b  T_CHECK";  break
9740: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9750: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
9760: 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20  RIMARYKEY:.     
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9790: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
97a0: 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
97b0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
97c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
97d0: 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c  NSTRAINT_NOTNULL
97e0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
97f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
9800: 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  NULL";break;.   
9810: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9820: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
9830: 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  HOOK:.          
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9860: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9870: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20  _COMMITHOOK";   
9880: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9890: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
98a0: 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61  INT_VTAB:    zNa
98b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
98c0: 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20  STRAINT_VTAB";  
98d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
98e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
98f0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  AINT_FUNCTION:. 
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9920: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9930: 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49  ONSTRAINT_FUNCTI
9940: 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ON";     break;.
9950: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9960: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
9970: 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ID:   zName = "S
9980: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9990: 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b  _ROWID";  break;
99a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
99b0: 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20  TE_MISMATCH:    
99c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
99d0: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22  SQLITE_MISMATCH"
99e0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
99f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9a00: 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20  ITE_MISUSE:     
9a10: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9a20: 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b  "SQLITE_MISUSE";
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9a40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9a50: 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20  LITE_NOLFS:     
9a60: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9a70: 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b   "SQLITE_NOLFS";
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9a90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9aa0: 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20  QLITE_AUTH:     
9ab0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9ac0: 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b  = "SQLITE_AUTH";
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
9ae0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9af0: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20  SQLITE_FORMAT:  
9b00: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9b10: 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41   = "SQLITE_FORMA
9b20: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  T";            b
9b30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9b40: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20   SQLITE_RANGE:  
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9b60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47  e = "SQLITE_RANG
9b70: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  E";             
9b80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9b90: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a  e SQLITE_NOTADB:
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9bb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
9bc0: 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20  ADB";           
9bd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9be0: 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20  se SQLITE_ROW:  
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9c00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f  ame = "SQLITE_RO
9c10: 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  W";             
9c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9c30: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
9c40: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
9c50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9c60: 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20  OTICE";         
9c70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9c80: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
9c90: 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20  CE_RECOVER_WAL: 
9ca0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9cb0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
9cc0: 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  AL";break;.     
9cd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
9ce0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
9cf0: 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20  BACK:.          
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9d20: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
9d30: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  OVER_ROLLBACK"; 
9d40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9d50: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
9d60: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  :            zNa
9d70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
9d80: 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20  NING";          
9d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9da0: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
9db0: 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e  G_AUTOINDEX:  zN
9dc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
9dd0: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22  RNING_AUTOINDEX"
9de0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9df0: 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a  ase SQLITE_DONE:
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9e10: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44  Name = "SQLITE_D
9e20: 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ONE";           
9e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9e40: 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d    }.  if( zName=
9e50: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
9e60: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
9e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9e80: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
9e90: 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45  ), zBuf, "SQLITE
9ea0: 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f  _UNKNOWN(%d)", o
9eb0: 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d  rigRc);.    zNam
9ec0: 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20  e = zBuf;.  }.  
9ed0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
9ee0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
9ef0: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
9f00: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
9f10: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
9f20: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
9f30: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
9f40: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
9f50: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
9f60: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
9f70: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
9f80: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
9f90: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
9fa0: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
9fb0: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
9fc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
9fd0: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
9fe0: 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69  ogic error or mi
9ff0: 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c  ssing database",
a000: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
a010: 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c  NTERNAL    */ 0,
a020: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
a030: 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61  ERM        */ "a
a040: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
a050: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
a060: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20   SQLITE_ABORT   
a070: 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b      */ "callback
a080: 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79   requested query
a090: 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20   abort",.    /* 
a0a0: 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20  SQLITE_BUSY     
a0b0: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
a0c0: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
a0d0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  /* SQLITE_LOCKED
a0e0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
a0f0: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
a100: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a110: 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a  TE_NOMEM       *
a120: 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  / "out of memory
a130: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a140: 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20  _READONLY    */ 
a150: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
a160: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
a170: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
a180: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
a190: 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65    */ "interrupte
a1a0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a1b0: 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f  E_IOERR       */
a1c0: 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   "disk I/O error
a1d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a1e0: 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20  _CORRUPT     */ 
a1f0: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
a200: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
a210: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a220: 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f  E_NOTFOUND    */
a230: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
a240: 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ion",.    /* SQL
a250: 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ITE_FULL        
a260: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20  */ "database or 
a270: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20  disk is full",. 
a280: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e     /* SQLITE_CAN
a290: 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61  TOPEN    */ "una
a2a0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
a2b0: 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20  base file",.    
a2c0: 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  /* SQLITE_PROTOC
a2d0: 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e  OL    */ "lockin
a2e0: 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20  g protocol",.   
a2f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
a300: 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65         */ "table
a310: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
a320: 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  a",.    /* SQLIT
a330: 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f  E_SCHEMA      */
a340: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
a350: 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a  a has changed",.
a360: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f      /* SQLITE_TO
a370: 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74  OBIG      */ "st
a380: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f  ring or blob too
a390: 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51   big",.    /* SQ
a3a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
a3b0: 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20   */ "constraint 
a3c0: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  failed",.    /* 
a3d0: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
a3e0: 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20     */ "datatype 
a3f0: 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f  mismatch",.    /
a400: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
a410: 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79       */ "library
a420: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
a430: 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22  out of sequence"
a440: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a450: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
a460: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
a470: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
a480: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
a490: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
a4a0: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
a4b0: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
a4c0: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
a4d0: 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61  */ "auxiliary da
a4e0: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
a4f0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
a500: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
a510: 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75  */ "bind or colu
a520: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
a530: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
a540: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
a550: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e    */ "file is en
a560: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
a570: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
a580: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
a590: 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77   *zErr = "unknow
a5a0: 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74  n error";.  swit
a5b0: 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
a5c0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
a5d0: 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20  ROLLBACK: {.    
a5e0: 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20    zErr = "abort 
a5f0: 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22  due to ROLLBACK"
a600: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a610: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
a620: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20  : {.      rc &= 
a630: 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  0xff;.      if( 
a640: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
a650: 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d   rc<ArraySize(aM
a660: 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  sg) && aMsg[rc]!
a670: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
a680: 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  rr = aMsg[rc];. 
a690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a6a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
a6b0: 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a  return zErr;.}..
a6c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a6d0: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ne implements a 
a6e0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68  busy callback th
a6f0: 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72  at sleeps and tr
a700: 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74  ies.** again unt
a710: 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c  il a timeout val
a720: 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  ue is reached.  
a730: 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  The timeout valu
a740: 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  e is.** an integ
a750: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  er number of mil
a760: 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64  liseconds passed
a770: 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74   in as the first
a780: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
a790: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a7a0: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
a7b0: 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74  lback(. void *pt
a7c0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
a7d0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
a7e0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20  nection */. int 
a7f0: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20  count           
a800: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a810: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
a820: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29  s been busy */.)
a830: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
a840: 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28  WIN || (defined(
a850: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
a860: 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73  HAVE_USLEEP).  s
a870: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64  tatic const u8 d
a880: 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  elays[] =.     {
a890: 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35   1, 2, 5, 10, 15
a8a0: 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32  , 20, 25, 25,  2
a8b0: 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30  5,  50,  50, 100
a8c0: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
a8d0: 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d  st u8 totals[] =
a8e0: 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c  .     { 0, 1, 3,
a8f0: 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c    8, 18, 33, 53,
a900: 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31   78, 103, 128, 1
a910: 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66  78, 228 };.# def
a920: 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79  ine NDELAY Array
a930: 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73  Size(delays).  s
a940: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
a950: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
a960: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d  nt timeout = db-
a970: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
a980: 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72  int delay, prior
a990: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  ;..  assert( cou
a9a0: 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63  nt>=0 );.  if( c
a9b0: 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b  ount < NDELAY ){
a9c0: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
a9d0: 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20  ays[count];.    
a9e0: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63  prior = totals[c
a9f0: 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ount];.  }else{.
aa00: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
aa10: 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20  ys[NDELAY-1];.  
aa20: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
aa30: 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c  [NDELAY-1] + del
aa40: 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41  ay*(count-(NDELA
aa50: 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Y-1));.  }.  if(
aa60: 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e   prior + delay >
aa70: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
aa80: 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20  delay = timeout 
aa90: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
aaa0: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
aab0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
aac0: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
aad0: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
aae0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
aaf0: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  lse.  sqlite3 *d
ab00: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
ab10: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
ab20: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
ab30: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
ab40: 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b  t;.  if( (count+
ab50: 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75  1)*1000 > timeou
ab60: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
ab70: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
ab80: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
ab90: 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65  , 1000000);.  re
aba0: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
abb0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
abc0: 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61  he given busy ha
abd0: 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ndler..**.** Thi
abe0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
abf0: 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72  led when an oper
ac00: 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74  ation failed wit
ac10: 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20  h a lock..** If 
ac20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
ac30: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
ac40: 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69  he lock is retri
ac50: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65  ed.  If it.** re
ac60: 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65  turns 0, the ope
ac70: 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69  ration aborts wi
ac80: 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53  th an SQLITE_BUS
ac90: 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  Y error..*/.int 
aca0: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
acb0: 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e  yHandler(BusyHan
acc0: 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  dler *p){.  int 
acd0: 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  rc;.  if( NEVER(
ace0: 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e  p==0) || p->xFun
acf0: 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79  c==0 || p->nBusy
ad00: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
ad10: 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70   rc = p->xFunc(p
ad20: 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  ->pArg, p->nBusy
ad30: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
ad40: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d  {.    p->nBusy =
ad50: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
ad60: 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20    p->nBusy++;.  
ad70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a  }.  return rc; .
ad80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ad90: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62  utine sets the b
ada0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  usy callback for
adb0: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
adc0: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
add0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
ade0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
adf0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  iven argument..*
ae00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
ae10: 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  sy_handler(.  sq
ae20: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
ae30: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
ae40: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
ae50: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
ae60: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ae70: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75  mutex);.  db->bu
ae80: 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20  syHandler.xFunc 
ae90: 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62  = xBusy;.  db->b
aea0: 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20  usyHandler.pArg 
aeb0: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
aec0: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
aed0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54  = 0;.  db->busyT
aee0: 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71  imeout = 0;.  sq
aef0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
af00: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
af10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
af20: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
af30: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
af40: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
af50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
af60: 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  ts the progress 
af70: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
af80: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
af90: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
afa0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
afb0: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
afc0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70   argument. The p
afd0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
afe0: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f   will.** be invo
aff0: 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f  ked every nOps o
b000: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  pcodes..*/.void 
b010: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
b020: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
b030: 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
b040: 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50  nOps,.  int (*xP
b050: 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c  rogress)(void*),
b060: 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29   .  void *pArg.)
b070: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
b080: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
b090: 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30  x);.  if( nOps>0
b0a0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f   ){.    db->xPro
b0b0: 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73  gress = xProgres
b0c0: 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  s;.    db->nProg
b0d0: 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67  ressOps = (unsig
b0e0: 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62  ned)nOps;.    db
b0f0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
b100: 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   pArg;.  }else{.
b110: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
b120: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  s = 0;.    db->n
b130: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b  ProgressOps = 0;
b140: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
b150: 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  ssArg = 0;.  }. 
b160: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
b170: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
b180: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
b190: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b1a0: 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c  nstalls a defaul
b1b0: 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74  t busy handler t
b1c0: 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68  hat waits for th
b1d0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e  e.** specified n
b1e0: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
b1f0: 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74  conds before ret
b200: 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74  urning 0..*/.int
b210: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
b220: 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64  meout(sqlite3 *d
b230: 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66  b, int ms){.  if
b240: 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71  ( ms>0 ){.    sq
b250: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
b260: 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66  er(db, sqliteDef
b270: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
b280: 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20  , (void*)db);.  
b290: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
b2a0: 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b  t = ms;.  }else{
b2b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
b2c0: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c  y_handler(db, 0,
b2d0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
b2e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b2f0: 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20  /*.** Cause any 
b300: 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f  pending operatio
b310: 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73  n to stop at its
b320: 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74   earliest opport
b330: 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  unity..*/.void s
b340: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
b350: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
b360: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
b370: 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  upted = 1;.}.../
b380: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b390: 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68  on is exactly th
b3a0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
b3b0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
b3c0: 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  n(), except.** t
b3d0: 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e  hat it is design
b3e0: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
b3f0: 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65  by internal code
b400: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  . The difference
b410: 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61   is.** that if a
b420: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
b430: 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  in sqlite3_creat
b440: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e  e_function(), an
b450: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
b460: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
b470: 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  he mallocFailed 
b480: 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a  flag cleared. .*
b490: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65  /.int sqlite3Cre
b4a0: 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ateFunc(.  sqlit
b4b0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
b4c0: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
b4d0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
b4e0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
b4f0: 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20  id *pUserData,. 
b500: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
b510: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
b520: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
b530: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
b540: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
b550: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
b560: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
b570: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
b580: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
b590: 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  ),.  FuncDestruc
b5a0: 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72  tor *pDestructor
b5b0: 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  .){.  FuncDef *p
b5c0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
b5d0: 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b   int extraFlags;
b5e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
b5f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
b600: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
b610: 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  f( zFunctionName
b620: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46  ==0 ||.      (xF
b630: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c  unc && (xFinal |
b640: 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20  | xStep)) || .  
b650: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
b660: 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70  xFinal && !xStep
b670: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46  )) ||.      (!xF
b680: 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20  unc && (!xFinal 
b690: 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  && xStep)) ||.  
b6a0: 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20      (nArg<-1 || 
b6b0: 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  nArg>SQLITE_MAX_
b6c0: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c  FUNCTION_ARG) ||
b6d0: 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61  .      (255<(nNa
b6e0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
b6f0: 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e  en30( zFunctionN
b700: 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65  ame))) ){.    re
b710: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
b720: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
b730: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
b740: 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51  UNC_CONSTANT==SQ
b750: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
b760: 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61  IC );.  extraFla
b770: 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49  gs = enc &  SQLI
b780: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
b790: 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49  ;.  enc &= (SQLI
b7a0: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c  TE_FUNC_ENCMASK|
b7b0: 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a  SQLITE_ANY);.  .
b7c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b7d0: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49  MIT_UTF16.  /* I
b7e0: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
b7f0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
b800: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
b810: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
b820: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
b830: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
b840: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
b850: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
b860: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
b870: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
b880: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
b890: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
b8a0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49   **.  ** If SQLI
b8b0: 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66  TE_ANY is specif
b8c0: 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76  ied, add three v
b8d0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  ersions of the f
b8e0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  unction.  ** to 
b8f0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  the hash table..
b900: 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d    */.  if( enc==
b910: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
b920: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
b930: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
b940: 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53  }else if( enc==S
b950: 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20  QLITE_ANY ){.   
b960: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
b970: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
b980: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
b990: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
b9a0: 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c  ITE_UTF8|extraFl
b9b0: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55  ags,.         pU
b9c0: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
b9d0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
b9e0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
b9f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ba00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
ba10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
ba20: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
ba30: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
ba40: 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61  TE_UTF16LE|extra
ba50: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
ba60: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
ba70: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
ba80: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
ba90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
baa0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bab0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
bac0: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
bad0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
bae0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
baf0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
bb00: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
bb10: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
bb20: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
bb30: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
bb40: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
bb50: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
bb60: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
bb70: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
bb80: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
bb90: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
bba0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
bbb0: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
bbc0: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
bbd0: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
bbe0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
bbf0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
bc00: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
bc10: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
bc20: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
bc30: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
bc40: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
bc50: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
bc60: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
bc70: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70  );.  if( p && (p
bc80: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
bc90: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
bca0: 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  K)==enc && p->nA
bcb0: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
bcc0: 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
bcd0: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
bce0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
bcf0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
bd00: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
bd10: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
bd20: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
bd30: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
bd40: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
bd50: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
bd60: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
bd70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
bd80: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
bd90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
bda0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
bdb0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ents(db);.    }.
bdc0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
bdd0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
bde0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
bdf0: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
be00: 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  u8)enc, 1);.  as
be10: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
be20: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
be30: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
be40: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
be50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
be60: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20  n older version 
be70: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
be80: 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65  with a configure
be90: 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  d destructor is.
bea0: 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61    ** being repla
beb0: 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  ced invoke the d
bec0: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
bed0: 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75  on here. */.  fu
bee0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
bef0: 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65  , p);..  if( pDe
bf00: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
bf10: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
bf20: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44  f++;.  }.  p->pD
bf30: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73  estructor = pDes
bf40: 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75  tructor;.  p->fu
bf50: 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75  ncFlags = (p->fu
bf60: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
bf70: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c  _FUNC_ENCMASK) |
bf80: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74   extraFlags;.  t
bf90: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63  estcase( p->func
bfa0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44  Flags & SQLITE_D
bfb0: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
bfc0: 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75    p->xFunc = xFu
bfd0: 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d  nc;.  p->xStep =
bfe0: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
bff0: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b  nalize = xFinal;
c000: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
c010: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70  = pUserData;.  p
c020: 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41  ->nArg = (u16)nA
c030: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rg;.  return SQL
c040: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c050: 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72   Create new user
c060: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69   functions..*/.i
c070: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
c080: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  e_function(.  sq
c090: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
c0a0: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
c0b0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
c0c0: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
c0d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
c0e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
c0f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
c100: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
c110: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
c120: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
c130: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
c140: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
c150: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
c160: 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  xt*).){.  return
c170: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c180: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
c190: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
c1a0: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
c1b0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30         xFinal, 0
c1e0: 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  );.}..int sqlite
c1f0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c200: 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  n_v2(.  sqlite3 
c210: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
c220: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
c230: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
c240: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
c250: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
c260: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c270: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
c280: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
c290: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
c2a0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
c2b0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
c2c0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
c2d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
c2e0: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f    void (*xDestro
c2f0: 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20  y)(void *).){.  
c300: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c310: 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73  ERROR;.  FuncDes
c320: 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20  tructor *pArg = 
c330: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
c340: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
c350: 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74  ex);.  if( xDest
c360: 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20  roy ){.    pArg 
c370: 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  = (FuncDestructo
c380: 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  r *)sqlite3DbMal
c390: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
c3a0: 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  of(FuncDestructo
c3b0: 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41  r));.    if( !pA
c3c0: 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73  rg ){.      xDes
c3d0: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
c3e0: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
c3f0: 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f     pArg->xDestro
c400: 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20  y = xDestroy;.  
c410: 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74    pArg->pUserDat
c420: 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20  a = p;.  }.  rc 
c430: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
c440: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  unc(db, zFunc, n
c450: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75  Arg, enc, p, xFu
c460: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
c470: 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20  l, pArg);.  if( 
c480: 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52  pArg && pArg->nR
c490: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ef==0 ){.    ass
c4a0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
c4b0: 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72  OK );.    xDestr
c4c0: 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  oy(p);.    sqlit
c4d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 72  e3DbFree(db, pAr
c4e0: 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20  g);.  }.. out:. 
c4f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
c500: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
c510: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c520: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
c530: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c540: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c550: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
c560: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
c570: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
c580: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
c590: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
c5a0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
c5b0: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
c5c0: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
c5d0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
c5e0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c5f0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
c600: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
c610: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
c620: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c630: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
c640: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
c650: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
c660: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
c670: 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69   *zFunc8;.  sqli
c680: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c690: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
c6a0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
c6b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75  cFailed );.  zFu
c6c0: 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  nc8 = sqlite3Utf
c6d0: 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74  16to8(db, zFunct
c6e0: 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  ionName, -1, SQL
c6f0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
c700: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c710: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
c720: 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65  Func8, nArg, eTe
c730: 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c  xtRep, p, xFunc,
c740: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30   xStep, xFinal,0
c750: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
c760: 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a  ee(db, zFunc8);.
c770: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
c780: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
c790: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c7a0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
c7b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c7c0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
c7d0: 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75  eclare that a fu
c7e0: 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
c7f0: 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20  overloaded by a 
c800: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
c810: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  *.** If the func
c820: 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69  tion already exi
c830: 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72  sts as a regular
c840: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
c850: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
c860: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
c870: 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  p.  If the funct
c880: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
c890: 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  st, then create.
c8a0: 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61  ** a new one tha
c8b0: 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20  t always throws 
c8c0: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
c8d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76  .  .**.** When v
c8e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
c8f0: 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20  tend to provide 
c900: 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75  an overloaded fu
c910: 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20  nction, they.** 
c920: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73  should call this
c930: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65   routine to make
c940: 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c   sure the global
c950: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
c960: 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75  ..** A global fu
c970: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73  nction must exis
c980: 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e  t in order for n
c990: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74  ame resolution t
c9a0: 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72  o work.** proper
c9b0: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
c9c0: 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
c9d0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
c9e0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
c9f0: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
ca00: 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e  nArg.){.  int nN
ca10: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
ca20: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
ca30: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ca40: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OK;.  sqlite3_mu
ca50: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ca60: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
ca70: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
ca80: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  db, zName, nName
ca90: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
caa0: 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  TF8, 0)==0 ){.  
cab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
cac0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61  eateFunc(db, zNa
cad0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
cae0: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61    0, sqlite3Inva
cb10: 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  lidFunction, 0, 
cb20: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  0, 0);.  }.  rc 
cb30: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
cb40: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
cb50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
cb60: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
cb70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
cb80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cb90: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69  TRACE./*.** Regi
cba0: 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e  ster a trace fun
cbb0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
cbc0: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
cbd0: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
cbe0: 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75  trace.** is retu
cbf0: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
cc00: 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74  NULL trace funct
cc10: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
cc20: 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65  o tracing is exe
cc30: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
cc40: 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61  LL.** trace is a
cc50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
cc60: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
cc70: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74  nvoked at the st
cc80: 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53  art of each.** S
cc90: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  QL statement..*/
cca0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74  .void *sqlite3_t
ccb0: 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62  race(sqlite3 *db
ccc0: 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29  , void (*xTrace)
ccd0: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
cce0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
ccf0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
cd00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cd10: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cd20: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
cd30: 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e  TraceArg;.  db->
cd40: 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b  xTrace = xTrace;
cd50: 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
cd60: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
cd70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
cd80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
cd90: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a  urn pOld;.}./*.*
cda0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f  * Register a pro
cdb0: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  file function.  
cdc0: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
cdd0: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
cde0: 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66  istered .** prof
cdf0: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ile function is 
ce00: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
ce10: 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65  * A NULL profile
ce20: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
ce30: 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e  that no profilin
ce40: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
ce50: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72  A non-NULL.** pr
ce60: 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74  ofile is a point
ce70: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
ce80: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
ce90: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
cea0: 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51  on of.** each SQ
ceb0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
cec0: 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64   is run..*/.void
ced0: 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c   *sqlite3_profil
cee0: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
cef0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66  ,.  void (*xProf
cf00: 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ile)(void*,const
cf10: 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69   char*,sqlite_ui
cf20: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
cf30: 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Arg.){.  void *p
cf40: 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Old;.  sqlite3_m
cf50: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
cf60: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
cf70: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b  db->pProfileArg;
cf80: 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20  .  db->xProfile 
cf90: 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62  = xProfile;.  db
cfa0: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20  ->pProfileArg = 
cfb0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
cfc0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
cfd0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
cfe0: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
cff0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
d000: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
d010: 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69  egister a functi
d020: 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
d030: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
d040: 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20  ion commits..** 
d050: 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66  If the invoked f
d060: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
d070: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
d080: 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65  he commit become
d090: 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e  s a.** rollback.
d0a0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
d0b0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20  3_commit_hook(. 
d0c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d0d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
d0e0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
d0f0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
d100: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
d110: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a  ack)(void*),  /*
d120: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   Function to inv
d130: 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d  oke on each comm
d140: 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  it */.  void *pA
d150: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d160: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
d170: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
d180: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
d190: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d1a0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d1b0: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
d1c0: 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
d1d0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
d1e0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
d1f0: 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
d200: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
d210: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d220: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
d230: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
d240: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
d250: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
d260: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
d270: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
d280: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
d290: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
d2a0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
d2b0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
d2c0: 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
d2d0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
d2e0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
d2f0: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
d300: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
d310: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
d320: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
d330: 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
d340: 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
d350: 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
d360: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
d370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d380: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
d390: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
d3a0: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
d3b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d3c0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d3d0: 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61  pRet = db->pUpda
d3e0: 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70  teArg;.  db->xUp
d3f0: 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78  dateCallback = x
d400: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
d410: 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  pUpdateArg = pAr
d420: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
d430: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d440: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
d450: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  et;.}../*.** Reg
d460: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
d470: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
d480: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
d490: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
d4a0: 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73  .** back by this
d4b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d4c0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
d4d0: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
d4e0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
d4f0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
d500: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
d510: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
d520: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
d530: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
d540: 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  d*), /* Callback
d550: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
d560: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
d570: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
d580: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
d590: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
d5a0: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
d5b0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d5c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
d5d0: 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
d5e0: 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
d5f0: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
d600: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
d610: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
d620: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
d630: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d640: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d650: 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
d660: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
d670: 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  L./*.** The sqli
d680: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
d690: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
d6a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61  ed by sqlite3_wa
d6b0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
d6c0: 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71  ()..** Invoke sq
d6d0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
d6e0: 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62  oint if the numb
d6f0: 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20  er of frames in 
d700: 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20  the log file.** 
d710: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
d720: 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20  sqlite3.pWalArg 
d730: 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
d740: 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f  er (the value co
d750: 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77  nfigured by.** w
d760: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
d770: 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  t())..*/ .int sq
d780: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
d790: 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  ook(.  void *pCl
d7a0: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a  ientData,     /*
d7b0: 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73   Argument */.  s
d7c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
d7d0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
d7e0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
d7f0: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
d800: 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  /* Database */. 
d810: 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20   int nFrame     
d820: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
d830: 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69  of WAL */.){.  i
d840: 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54  f( nFrame>=SQLIT
d850: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c  E_PTR_TO_INT(pCl
d860: 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20  ientData) ){.   
d870: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
d880: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
d890: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
d8a0: 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29  ckpoint(db, zDb)
d8b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
d8c0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
d8d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
d8e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
d8f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d900: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  WAL */../*.** Co
d910: 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74  nfigure an sqlit
d920: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
d930: 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61  llback to automa
d940: 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
d950: 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  nt.** a database
d960: 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e   after committin
d970: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
d980: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72  if there are nFr
d990: 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66  ame or.** more f
d9a0: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
d9b0: 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a   file. Passing z
d9c0: 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76  ero or a negativ
d9d0: 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a  e value as the.*
d9e0: 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74  * nFrame paramet
d9f0: 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f  er disables auto
da00: 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
da10: 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a  s entirely..**.*
da20: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  * The callback r
da30: 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69  egistered by thi
da40: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61  s function repla
da50: 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ces any existing
da60: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67   callback.** reg
da70: 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71  istered using sq
da80: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
da90: 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69  . Likewise, regi
daa0: 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61  stering a callba
dab0: 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  ck.** using sqli
dac0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64  te3_wal_hook() d
dad0: 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f  isables the auto
dae0: 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
daf0: 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f   mechanism.** co
db00: 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73  nfigured by this
db10: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
db20: 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  t sqlite3_wal_au
db30: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  tocheckpoint(sql
db40: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
db50: 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51  rame){.#ifdef SQ
db60: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
db70: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
db80: 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (db);.  UNUSED_P
db90: 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29  ARAMETER(nFrame)
dba0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 46  ;.#else.  if( nF
dbb0: 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71  rame>0 ){.    sq
dbc0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
dbd0: 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  b, sqlite3WalDef
dbe0: 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45  aultHook, SQLITE
dbf0: 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61  _INT_TO_PTR(nFra
dc00: 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  me));.  }else{. 
dc10: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
dc20: 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ook(db, 0, 0);. 
dc30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
dc40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dc50: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
dc60: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
dc70: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
dc80: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
dc90: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
dca0: 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68  nto the write-ah
dcb0: 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20  ead-log by this 
dcc0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
dcd0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
dce0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a  lite3_wal_hook(.
dcf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
dd20: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20  hook to this db 
dd30: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28  handle */.  int(
dd40: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
dd50: 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f   *, sqlite3*, co
dd60: 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c  nst char*, int),
dd70: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
dda0: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
ddb0: 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b  Callback() */.){
ddc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ddd0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20  OMIT_WAL.  void 
dde0: 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
ddf0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
de00: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
de10: 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20  = db->pWalArg;. 
de20: 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63   db->xWalCallbac
de30: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
de40: 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70   db->pWalArg = p
de50: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
de60: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
de70: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
de80: 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65  pRet;.#else.  re
de90: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
dea0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
deb0: 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
dec0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
ded0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
dee0: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
def0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
df00: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
df10: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
df20: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df40: 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64  Name of attached
df50: 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55   database (or NU
df60: 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f  LL) */.  int eMo
df70: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
df80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
df90: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20  TE_CHECKPOINT_* 
dfa0: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
dfb0: 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20  pnLog,          
dfc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
dfd0: 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c  T: Size of WAL l
dfe0: 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a  og in frames */.
dff0: 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20    int *pnCkpt   
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e010: 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20    /* OUT: Total 
e020: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
e030: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f   checkpointed */
e040: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
e050: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74  E_OMIT_WAL.  ret
e060: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
e070: 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20  else.  int rc;  
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e0a0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
e0b0: 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  Db = SQLITE_MAX_
e0c0: 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71  ATTACHED;  /* sq
e0d0: 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65  lite3.aDb[] inde
e0e0: 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b  x of db to check
e0f0: 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 49  point */..  /* I
e100: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75  nitialize the ou
e110: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74  tput variables t
e120: 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20  o -1 in case an 
e130: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
e140: 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a  .  if( pnLog ) *
e150: 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66  pnLog = -1;.  if
e160: 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b  ( pnCkpt ) *pnCk
e170: 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65  pt = -1;..  asse
e180: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
e190: 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c 49 54  POINT_FULL>SQLIT
e1a0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
e1b0: 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
e1c0: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
e1d0: 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54 45 5f  INT_FULL<SQLITE_
e1e0: 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
e1f0: 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RT );.  assert( 
e200: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
e210: 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53 51 4c  T_PASSIVE+2==SQL
e220: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
e230: 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66 28 20  ESTART );.  if( 
e240: 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45  eMode<SQLITE_CHE
e250: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20  CKPOINT_PASSIVE 
e260: 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f  || eMode>SQLITE_
e270: 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
e280: 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  RT ){.    return
e290: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
e2a0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d    }..  sqlite3_m
e2b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
e2c0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62  utex);.  if( zDb
e2d0: 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20   && zDb[0] ){.  
e2e0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
e2f0: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
e300: 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  b);.  }.  if( iD
e310: 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  b<0 ){.    rc = 
e320: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
e330: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
e340: 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  b, SQLITE_ERROR,
e350: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
e360: 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20  se: %s", zDb);. 
e370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
e380: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69   sqlite3Checkpoi
e390: 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64  nt(db, iDb, eMod
e3a0: 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74  e, pnLog, pnCkpt
e3b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  );.    sqlite3Er
e3c0: 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
e3d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
e3e0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
e3f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
e400: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
e410: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
e420: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
e430: 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
e440: 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a  tabase zDb. If z
e450: 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69  Db is NULL, or i
e460: 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62  f the buffer zDb
e470: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f   points.** to co
e480: 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65  ntains a zero-le
e490: 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c  ngth string, all
e4a0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
e4b0: 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63  ses are .** chec
e4c0: 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74  kpointed..*/.int
e4d0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
e4e0: 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
e4f0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
e500: 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  *zDb){.  return 
e510: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
e520: 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44  kpoint_v2(db, zD
e530: 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  b, SQLITE_CHECKP
e540: 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 30 2c  OINT_PASSIVE, 0,
e550: 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   0);.}..#ifndef 
e560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
e570: 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63  /*.** Run a chec
e580: 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61  kpoint on databa
e590: 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20  se iDb. This is 
e5a0: 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62  a no-op if datab
e5b0: 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f  ase iDb is.** no
e5c0: 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
e5d0: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a   in WAL mode..**
e5e0: 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
e5f0: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20  tion is open on 
e600: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
e610: 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c  ng checkpointed,
e620: 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
e630: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
e640: 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63  E_LOCKED and a c
e650: 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74  heckpoint is not
e660: 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a   attempted. If .
e670: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
e680: 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67  rs while running
e690: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c   the checkpoint,
e6a0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
e6b0: 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
e6c0: 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49  urned (i.e. SQLI
e6d0: 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72  TE_IOERR). Other
e6e0: 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
e6f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
e700: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
e710: 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65  dle db should be
e720: 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c   held by the cal
e730: 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a  ler. The mutex.*
e740: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
e750: 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62  h the specific b
e760: 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63  -tree being chec
e770: 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65  kpointed is take
e780: 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e  n by.** this fun
e790: 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20  ction while the 
e7a0: 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75  checkpoint is ru
e7b0: 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nning..**.** If 
e7c0: 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51  iDb is passed SQ
e7d0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
e7e0: 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61  D, then all atta
e7f0: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
e800: 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  re.** checkpoint
e810: 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
e820: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
e830: 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d  t is returned im
e840: 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e  mediately -.** n
e850: 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
e860: 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  e to checkpoint 
e870: 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61  any remaining da
e880: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50  tabases..**.** P
e890: 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69  arameter eMode i
e8a0: 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  s one of SQLITE_
e8b0: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
e8c0: 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54  VE, FULL or REST
e8d0: 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ART..*/.int sqli
e8e0: 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71  te3Checkpoint(sq
e8f0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
e900: 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69  Db, int eMode, i
e910: 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a  nt *pnLog, int *
e920: 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72  pnCkpt){.  int r
e930: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e950: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
e960: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e980: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
e990: 65 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68  e through attach
e9a0: 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20  ed dbs */.  int 
e9b0: 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20  bBusy = 0;      
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e9d0: 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55  rue if SQLITE_BU
e9e0: 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f  SY has been enco
e9f0: 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73  untered */..  as
ea00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
ea10: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
ea20: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
ea30: 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f   !pnLog || *pnLo
ea40: 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72  g==-1 );.  asser
ea50: 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70  t( !pnCkpt || *p
ea60: 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20  nCkpt==-1 );..  
ea70: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
ea80: 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  Db && rc==SQLITE
ea90: 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  _OK; i++){.    i
eaa0: 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62  f( i==iDb || iDb
eab0: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
eac0: 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72  ACHED ){.      r
ead0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
eae0: 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61  Checkpoint(db->a
eaf0: 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65  Db[i].pBt, eMode
eb00: 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
eb10: 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20  ;.      pnLog = 
eb20: 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20  0;.      pnCkpt 
eb30: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
eb40: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
eb50: 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20  {.        bBusy 
eb60: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
eb70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
eb80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
eb90: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
eba0: 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79  LITE_OK && bBusy
ebb0: 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
ebc0: 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  : rc;.}.#endif /
ebd0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
ebe0: 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  L */../*.** This
ebf0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
ec00: 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d  s true if main-m
ec10: 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  emory should be 
ec20: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  used instead of.
ec30: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
ec40: 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e  ile for transien
ec50: 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e  t pager files an
ec60: 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  d statement jour
ec70: 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  nals..** The val
ec80: 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65  ue returned depe
ec90: 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
eca0: 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f   of db->temp_sto
ecb0: 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70  re (runtime.** p
ecc0: 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68  arameter) and th
ecd0: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76  e compile time v
ece0: 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54  alue of SQLITE_T
ecf0: 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a  EMP_STORE. The.*
ed00: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  * following tabl
ed10: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
ed20: 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
ed30: 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76  ween these two v
ed40: 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69  alues.** and thi
ed50: 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  s functions retu
ed60: 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  rn value..**.** 
ed70: 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54    SQLITE_TEMP_ST
ed80: 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70  ORE     db->temp
ed90: 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74  _store     Locat
eda0: 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  ion of temporary
edb0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d   database.**   -
edc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edd0: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
ede0: 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee00: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
ee30: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
ee40: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
ee70: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
ee80: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
ee90: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
eea0: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
eeb0: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
eec0: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
eed0: 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
eee0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
ef00: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
ef10: 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
ef50: 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
ef80: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
ef90: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20  eturn 1).**   2 
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
efc0: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
efd0: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
efe0: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
eff0: 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
f000: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
f010: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
f020: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d  /.int sqlite3Tem
f030: 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20  pInMemory(const 
f040: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
f050: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
f060: 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20  ORE==1.  return 
f070: 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
f080: 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==2 );.#endif.#i
f090: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
f0a0: 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20  ORE==2.  return 
f0b0: 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
f0c0: 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  !=1 );.#endif.#i
f0d0: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
f0e0: 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20  ORE==3.  return 
f0f0: 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  1;.#endif.#if SQ
f100: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c  LITE_TEMP_STORE<
f110: 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50  1 || SQLITE_TEMP
f120: 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75 72  _STORE>3.  retur
f130: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
f140: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
f150: 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  8 encoded Englis
f160: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
f170: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
f180: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
f190: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  or..*/.const cha
f1a0: 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  r *sqlite3_errms
f1b0: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  g(sqlite3 *db){.
f1c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
f1d0: 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
f1e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
f1f0: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
f200: 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MEM);.  }.  if( 
f210: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f220: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
f230: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
f240: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
f250: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b  TE_MISUSE_BKPT);
f260: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
f270: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f280: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
f290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f2a0: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
f2b0: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
f2c0: 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  MEM);.  }else{. 
f2d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
f2e0: 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20  >pErr==0 );.    
f2f0: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
f300: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62  e3_value_text(db
f310: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73  ->pErr);.    ass
f320: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
f330: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
f340: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
f350: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
f360: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a  r(db->errCode);.
f370: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f380: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f390: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f3a0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
f3b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
f3c0: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TF16./*.** Retur
f3d0: 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  n UTF-16 encoded
f3e0: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
f3f0: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
f400: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
f410: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
f420: 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
f430: 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74  3_errmsg16(sqlit
f440: 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
f450: 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f  c const u16 outO
f460: 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  fMem[] = {.    '
f470: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
f480: 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27  ', 'o', 'f', ' '
f490: 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c  , 'm', 'e', 'm',
f4a0: 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'o', 'r', 'y', 
f4b0: 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
f4c0: 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65  const u16 misuse
f4d0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20  [] = {.    'l', 
f4e0: 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27  'i', 'b', 'r', '
f4f0: 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20  a', 'r', 'y', ' 
f500: 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27  ', .    'r', 'o'
f510: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c  , 'u', 't', 'i',
f520: 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20   'n', 'e', ' ', 
f530: 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27  .    'c', 'a', '
f540: 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64  l', 'l', 'e', 'd
f550: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
f560: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
f570: 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20   .    'o', 'f', 
f580: 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27  ' ', .    's', '
f590: 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65  e', 'q', 'u', 'e
f5a0: 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27  ', 'n', 'c', 'e'
f5b0: 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
f5c0: 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
f5d0: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
f5e0: 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
f5f0: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
f600: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f610: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
f620: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
f630: 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
f640: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f650: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f660: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
f670: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f680: 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
f690: 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
f6a0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
f6b0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
f6c0: 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
f6d0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
f6e0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 64  lite3Error(db, d
f6f0: 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69  b->errCode, sqli
f700: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
f710: 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a  rCode));.      z
f720: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
f730: 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
f740: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
f750: 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68  A malloc() may h
f760: 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69  ave failed withi
f770: 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  n the call to sq
f780: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
f790: 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  16().    ** abov
f7a0: 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
f7b0: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
f7c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f7d0: 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a  d flag needs to.
f7e0: 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65      ** be cleare
f7f0: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
f800: 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
f810: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
f820: 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69   via.    ** sqli
f830: 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f  te3ApiExit(), to
f840: 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74   avoid setting t
f850: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
f860: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
f870: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d  ..    */.    db-
f880: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
f890: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
f8a0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f8b0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f8c0: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
f8d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
f8e0: 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  16 */../*.** Ret
f8f0: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
f900: 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67  ent error code g
f910: 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53  enerated by an S
f920: 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49  QLite routine. I
f930: 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73  f NULL is.** pas
f940: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
f950: 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20  tion, we assume 
f960: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  a malloc() faile
f970: 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  d during sqlite3
f980: 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _open()..*/.int 
f990: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
f9a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
f9b0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
f9c0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
f9d0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
f9e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
f9f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
fa00: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
fa10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
fa20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fa30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
fa40: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
fa50: 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  de & db->errMask
fa60: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
fa70: 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
fa80: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
fa90: 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
faa0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
fab0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
fac0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fad0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
fae0: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
faf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fb00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fb10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
fb20: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
fb30: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ode;.}../*.** Re
fb40: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
fb50: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
fb60: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
fb70: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
fb80: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f  ** argument.  Fo
fb90: 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70  r now, this simp
fba0: 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74  ly calls the int
fbb0: 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72  ernal sqlite3Err
fbc0: 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  Str().** functio
fbd0: 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
fbe0: 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72   *sqlite3_errstr
fbf0: 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75  (int rc){.  retu
fc00: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
fc10: 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  (rc);.}../*.** I
fc20: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 61  nvalidate all ca
fc30: 63 68 65 64 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  ched KeyInfo obj
fc40: 65 63 74 73 20 66 6f 72 20 64 61 74 61 62 61 73  ects for databas
fc50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62  e connection "db
fc60: 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ".*/.static void
fc70: 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63 68 65   invalidateCache
fc80: 64 4b 65 79 49 6e 66 6f 28 73 71 6c 69 74 65 33  dKeyInfo(sqlite3
fc90: 20 2a 64 62 29 7b 0a 20 20 44 62 20 2a 70 44 62   *db){.  Db *pDb
fca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fcb0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
fcc0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
fcd0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
fce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fcf0: 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
fd00: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 48 61 73   number */.  Has
fd10: 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
fd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
fd30: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
fd40: 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20  les in pDb */.  
fd50: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fd70: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
fd80: 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
fd90: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
fda0: 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20          /* Each 
fdb0: 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 66 6f 72 28  index */..  for(
fdc0: 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
fdd0: 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
fde0: 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
fdf0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
fe00: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
fe10: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
fe20: 45 6e 74 65 72 28 70 44 62 2d 3e 70 42 74 29 3b  Enter(pDb->pBt);
fe30: 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
fe40: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
fe50: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
fe60: 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
fe70: 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
fe80: 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
fe90: 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
fea0: 61 28 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  a(k);.      for(
feb0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
fec0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
fed0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
fee0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4b      if( pIdx->pK
fef0: 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d 3e  eyInfo && pIdx->
ff00: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
ff10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ff20: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
ff30: 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f  f(pIdx->pKeyInfo
ff40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
ff50: 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  x->pKeyInfo = 0;
ff60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ff70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
ff80: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
ff90: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a  Db->pBt);.  }.}.
ffa0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
ffb0: 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  new collating fu
ffc0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62  nction for datab
ffd0: 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e  ase "db".  The n
ffe0: 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20  ame is zName.** 
fff0: 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  and the encoding
10000 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74   is enc..*/.stat
10010 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c  ic int createCol
10020 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
10030 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3* db,.  const c
10040 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75  har *zName, .  u
10050 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70  8 enc,.  void* p
10060 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
10070 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
10080 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
10090 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
100a0 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
100b0 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  *).){.  CollSeq 
100c0 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e  *pColl;.  int en
100d0 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20  c2;.  int nName 
100e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
100f0 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61  0(zName);.  .  a
10100 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10110 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
10120 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
10130 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
10140 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
10150 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
10160 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
10170 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
10180 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
10190 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
101a0 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
101b0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
101c0 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
101d0 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
101e0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
101f0 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b  */.  enc2 = enc;
10200 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
10210 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
10220 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  );.  testcase( e
10230 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
10240 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69  6_ALIGNED );.  i
10250 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  f( enc2==SQLITE_
10260 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53  UTF16 || enc2==S
10270 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
10280 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20  NED ){.    enc2 
10290 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
102a0 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TIVE;.  }.  if( 
102b0 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38  enc2<SQLITE_UTF8
102c0 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f   || enc2>SQLITE_
102d0 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72  UTF16BE ){.    r
102e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
102f0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
10300 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
10310 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69  s call is removi
10320 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20  ng or replacing 
10330 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c  an existing coll
10340 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75  ation .  ** sequ
10350 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64  ence. If so, and
10360 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
10370 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75  e VMs, return bu
10380 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a  sy. If there.  *
10390 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
103a0 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  VMs, invalidate 
103b0 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  any pre-compiled
103c0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
103d0 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  /.  pColl = sqli
103e0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
103f0 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
10400 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43  me, 0);.  if( pC
10410 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
10420 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  mp ){.    if( db
10430 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
10440 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10450 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
10460 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
10470 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
10480 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e  modify collation
10490 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f   sequence due to
104a0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
104b0 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ts");.      retu
104c0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
104d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
104e0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
104f0 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
10500 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63     invalidateCac
10510 68 65 64 4b 65 79 49 6e 66 6f 28 64 62 29 3b 0a  hedKeyInfo(db);.
10520 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
10530 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
10540 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
10550 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
10560 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
10570 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
10580 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
10590 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
105a0 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
105b0 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
105c0 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
105d0 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
105e0 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
105f0 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
10600 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
10610 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
10620 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
10630 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
10640 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
10650 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
10660 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
10670 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
10680 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
10690 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
106a0 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
106b0 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
106c0 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
106d0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
106e0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
106f0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
10700 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
10710 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
10720 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
10730 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
10740 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
10750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
10760 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
10770 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10780 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
10790 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
107a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
107b0 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
107c0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
107d0 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
107e0 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
107f0 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
10800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10810 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
10820 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d  ompare;.  pColl-
10830 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20  >pUser = pCtx;. 
10840 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78   pColl->xDel = x
10850 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e  Del;.  pColl->en
10860 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20  c = (u8)(enc2 | 
10870 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54  (enc & SQLITE_UT
10880 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20  F16_ALIGNED));. 
10890 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
108a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
108b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
108c0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
108d0 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
108e0 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
108f0 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
10900 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
10910 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
10920 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
10930 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
10940 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
10950 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
10960 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
10970 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
10980 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
10990 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
109a0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
109b0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
109c0 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
109d0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
109e0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
109f0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
10a00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
10a10 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
10a20 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
10a30 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
10a40 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
10a50 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
10a60 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
10a70 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
10a80 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f  UMBER,.  SQLITE_
10a90 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
10aa0 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  H,.};../*.** Mak
10ab0 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20  e sure the hard 
10ac0 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74  limits are set t
10ad0 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c  o reasonable val
10ae0 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ues.*/.#if SQLIT
10af0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30  E_MAX_LENGTH<100
10b00 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10b10 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  MAX_LENGTH must 
10b20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
10b30 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
10b40 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
10b50 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
10b60 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10b70 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
10b80 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23  ast 100.#endif.#
10b90 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  if SQLITE_MAX_SQ
10ba0 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f  L_LENGTH>SQLITE_
10bb0 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72  MAX_LENGTH.# err
10bc0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
10bd0 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f  L_LENGTH must no
10be0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
10bf0 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  n SQLITE_MAX_LEN
10c00 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  GTH.#endif.#if S
10c10 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
10c20 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72  ND_SELECT<2.# er
10c30 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
10c40 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d  OMPOUND_SELECT m
10c50 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
10c60 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  2.#endif.#if SQL
10c70 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c  ITE_MAX_VDBE_OP<
10c80 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  40.# error SQLIT
10c90 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75  E_MAX_VDBE_OP mu
10ca0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34  st be at least 4
10cb0 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
10cc0 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
10cd0 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45  _ARG<0 || SQLITE
10ce0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
10cf0 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53  G>1000.# error S
10d00 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
10d10 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62  ON_ARG must be b
10d20 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30  etween 0 and 100
10d30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
10d40 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
10d50 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
10d60 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20  _ATTACHED>125.# 
10d70 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10d80 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62  _ATTACHED must b
10d90 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
10da0 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  125.#endif.#if S
10db0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
10dc0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a  ATTERN_LENGTH<1.
10dd0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10de0 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
10df0 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
10e00 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
10e10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10e20 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65  COLUMN>32767.# e
10e30 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10e40 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20  COLUMN must not 
10e50 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e  exceed 32767.#en
10e60 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10e70 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
10e80 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
10e90 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
10ea0 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  PTH must be at l
10eb0 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  east 1.#endif...
10ec0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
10ed0 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
10ee0 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
10ef0 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
10f00 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
10f10 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
10f20 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
10f30 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
10f40 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
10f50 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
10f60 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
10f70 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
10f80 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
10f90 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
10fa0 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
10fb0 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
10fc0 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
10fd0 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
10fe0 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
10ff0 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
11000 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
11010 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
11020 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
11030 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
11040 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
11050 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20  ldLimit;...  /* 
11060 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
11070 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65  0189-54097 For e
11080 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f  ach limit catego
11090 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ry SQLITE_LIMIT_
110a0 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20  NAME.  ** there 
110b0 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20  is a hard upper 
110c0 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d  bound set at com
110d0 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43  pile-time by a C
110e0 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20   preprocessor.  
110f0 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ** macro called 
11100 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e  SQLITE_MAX_NAME.
11110 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20   (The "_LIMIT_" 
11120 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63  in the name is c
11130 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22  hanged to.  ** "
11140 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20  _MAX_".).  */.  
11150 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11160 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11170 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
11180 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
11190 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
111a0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
111b0 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  SQL_LENGTH]==SQL
111c0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
111d0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
111e0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
111f0 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d  E_LIMIT_COLUMN]=
11200 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  =SQLITE_MAX_COLU
11210 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  MN );.  assert( 
11220 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11230 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
11240 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
11250 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  EXPR_DEPTH );.  
11260 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11270 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11280 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
11290 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  ==SQLITE_MAX_COM
112a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20  POUND_SELECT);. 
112b0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
112c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
112d0 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54  _VDBE_OP]==SQLIT
112e0 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b  E_MAX_VDBE_OP );
112f0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
11300 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11310 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
11320 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ==SQLITE_MAX_FUN
11330 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61  CTION_ARG );.  a
11340 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11350 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41  t[SQLITE_LIMIT_A
11360 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45  TTACHED]==SQLITE
11370 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b  _MAX_ATTACHED );
11380 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
11390 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
113a0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
113b0 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20  LENGTH]==.      
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
113f0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
11400 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
11410 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11420 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
11430 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53  IABLE_NUMBER]==S
11440 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
11450 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73  LE_NUMBER);.  as
11460 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
11470 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  [SQLITE_LIMIT_TR
11480 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51  IGGER_DEPTH]==SQ
11490 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
114a0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
114b0 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  rt( SQLITE_LIMIT
114c0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d  _TRIGGER_DEPTH==
114d0 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d  (SQLITE_N_LIMIT-
114e0 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69  1) );...  if( li
114f0 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74  mitId<0 || limit
11500 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  Id>=SQLITE_N_LIM
11510 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
11520 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69   -1;.  }.  oldLi
11530 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  mit = db->aLimit
11540 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28  [limitId];.  if(
11550 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20   newLimit>=0 ){ 
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37    /* IMP: R-5247
11580 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69  6-28732 */.    i
11590 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72  f( newLimit>aHar
115a0 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  dLimit[limitId] 
115b0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  ){.      newLimi
115c0 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c  t = aHardLimit[l
115d0 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50  imitId];  /* IMP
115e0 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20  : R-51463-25634 
115f0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  */.    }.    db-
11600 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
11610 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d   = newLimit;.  }
11620 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d  .  return oldLim
11630 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
11640 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
11650 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f  R-53341-35419 */
11660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
11670 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
11680 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52  to parse both UR
11690 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66  Is and non-URI f
116a0 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20  ilenames passed 
116b0 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74  by the.** user t
116c0 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  o API functions 
116d0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f  sqlite3_open() o
116e0 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
116f0 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74  2(), and for dat
11700 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70  abase.** URIs sp
11710 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
11720 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d  of ATTACH statem
11730 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
11740 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
11750 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
11760 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11770 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f  he VFS to use (o
11780 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73  r.** a NULL to s
11790 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75  ignify the defau
117a0 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55  lt VFS) if the U
117b0 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  RI does not cont
117c0 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a  ain a "vfs=xxx".
117d0 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
117e0 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  er. The second a
117f0 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
11800 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e   the URI (or non
11810 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a  -URI filename).*
11820 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74  * itself. When t
11830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11840 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61  called the *pFla
11850 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  gs variable shou
11860 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68  ld contain.** th
11870 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20  e default flags 
11880 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
11890 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68  base handle with
118a0 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72  . The value stor
118b0 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73  ed in.** *pFlags
118c0 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20   may be updated 
118d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
118e0 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65   if the URI file
118f0 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a  name contains .*
11900 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72  * "cache=xxx" or
11910 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72   "mode=xxx" quer
11920 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a  y parameters..**
11930 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11940 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
11950 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
11960 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73  s case *ppVfs is
11970 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
11980 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74  .** the VFS that
11990 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
119a0 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
119b0 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69  base file. *pzFi
119c0 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  le is set to.** 
119d0 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
119e0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
119f0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
11a00 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73  e to open. It is
11a10 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
11a20 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
11a30 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
11a40 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  lly call sqlite3
11a50 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
11a60 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
11a70 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
11a80 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
11a90 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
11aa0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
11ab0 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67  ed and *pzErrMsg
11ac0 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74  .** may be set t
11ad0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
11ae0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
11af0 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
11b00 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  ge error .** mes
11b10 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
11b20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
11b30 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
11b40 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
11b50 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
11b60 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  r by calling sql
11b70 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
11b80 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65  int sqlite3Parse
11b90 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  Uri(.  const cha
11ba0 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20  r *zDefaultVfs, 
11bb0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f         /* VFS to
11bc0 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d   use if no "vfs=
11bd0 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f  xxx" query optio
11be0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
11bf0 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20  r *zUri,        
11c00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
11c10 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20  rminated URI to 
11c20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  parse */.  unsig
11c30 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  ned int *pFlags,
11c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
11c50 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45  /OUT: SQLITE_OPE
11c60 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  N_XXX flags */. 
11c70 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70   sqlite3_vfs **p
11c80 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
11c90 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20   /* OUT: VFS to 
11ca0 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  use */ .  char *
11cb0 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20  *pzFile,        
11cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
11cd0 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f  : Filename compo
11ce0 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20  nent of URI */. 
11cf0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
11d20 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53  essage (if rc!=S
11d30 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a  QLITE_OK) */.){.
11d40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11d50 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
11d60 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46   int flags = *pF
11d70 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lags;.  const ch
11d80 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61  ar *zVfs = zDefa
11d90 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a  ultVfs;.  char *
11da0 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b  zFile;.  char c;
11db0 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71  .  int nUri = sq
11dc0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
11dd0 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ri);..  assert( 
11de0 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a  *pzErrMsg==0 );.
11df0 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26  .  if( ((flags &
11e00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
11e10 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ) || sqlite3Glob
11e20 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72  alConfig.bOpenUr
11e30 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d  i) .   && nUri>=
11e40 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69  5 && memcmp(zUri
11e50 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30  , "file:", 5)==0
11e60 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
11e70 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65  *zOpt;.    int e
11e80 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
11e90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
11ea0 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61  er state when pa
11eb0 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20  rsing URI */.   
11ec0 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20   int iIn;       
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ee0 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65  * Input characte
11ef0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
11f00 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20  nt iOut = 0;    
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72  Output character
11f30 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
11f40 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32  t nByte = nUri+2
11f50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
11f60 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
11f70 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
11f80 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
11f90 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  he SQLITE_OPEN_U
11fa0 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  RI flag is set t
11fb0 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68  o indicate to th
11fc0 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20  e VFS xOpen .   
11fd0 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20   ** method that 
11fe0 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74  there may be ext
11ff0 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  ra parameters fo
12000 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  llowing the file
12010 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66  -name.  */.    f
12020 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
12030 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f  PEN_URI;..    fo
12040 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72  r(iIn=0; iIn<nUr
12050 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20  i; iIn++) nByte 
12060 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27  += (zUri[iIn]=='
12070 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  &');.    zFile =
12080 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
12090 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
120a0 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
120b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
120c0 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 6e     iIn = 5;.#ifn
120d0 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57  def SQLITE_ALLOW
120e0 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20  _URI_AUTHORITY. 
120f0 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
12100 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74  e scheme and aut
12110 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20  hority segments 
12120 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20  of the URI. */. 
12130 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d     if( zUri[5]==
12140 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d  '/' && zUri[6]==
12150 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '/' ){.      iIn
12160 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 7;.      whil
12170 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20  e( zUri[iIn] && 
12180 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29  zUri[iIn]!='/' )
12190 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
121a0 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e  ( iIn!=7 && (iIn
121b0 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22  !=16 || memcmp("
121c0 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72  localhost", &zUr
121d0 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20  i[7], 9)) ){.   
121e0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
121f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12200 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75  ("invalid uri au
12210 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20  thority: %.*s", 
12220 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
12230 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20  -7, &zUri[7]);. 
12240 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
12250 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
12260 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
12270 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
12280 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
12290 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65  /* Copy the file
122a0 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65  name and any que
122b0 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e  ry parameters in
122c0 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66  to the zFile buf
122d0 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63  fer. .    ** Dec
122e0 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63  ode %HH escape c
122f0 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77  odes along the w
12300 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ay. .    **.    
12310 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c  ** Within this l
12320 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53  oop, variable eS
12330 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20  tate may be set 
12340 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65  to 0, 1 or 2, de
12350 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  pending.    ** o
12360 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f  n the parsing co
12370 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77  ntext. As follow
12380 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
12390 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69     0: Parsing fi
123a0 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20  le-name..    ** 
123b0 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d    1: Parsing nam
123c0 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
123d0 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
123e0 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
123f0 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76  *   2: Parsing v
12400 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  alue section of 
12410 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65  a name=value que
12420 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  ry parameter..  
12430 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20    */.    eState 
12440 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
12450 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
12460 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a  =0 && c!='#' ){.
12470 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
12480 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20     if( c=='%' . 
12490 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
124a0 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
124b0 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73  n]) .       && s
124c0 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
124d0 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20  Uri[iIn+1]) .   
124e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
124f0 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74  t octet = (sqlit
12500 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
12510 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20  iIn++]) << 4);. 
12520 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20         octet += 
12530 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
12540 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20  zUri[iIn++]);.. 
12550 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
12560 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74  ctet>=0 && octet
12570 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20  <256 );.        
12580 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a  if( octet==0 ){.
12590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
125a0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
125b0 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
125c0 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
125d0 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
125e0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
125f0 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
12600 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
12610 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
12620 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
12630 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
12640 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
12650 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
12660 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
12670 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
12680 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
12690 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
126a0 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
126b0 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
126c0 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
126d0 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
126e0 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
126f0 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
12700 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
12720 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
12730 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
12740 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12750 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
12760 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
12770 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
12780 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
12790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
127a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
127b0 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f   }.        c = o
127c0 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ctet;.      }els
127d0 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20  e if( eState==1 
127e0 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d  && (c=='&' || c=
127f0 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='=') ){.       
12800 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d   if( zFile[iOut-
12810 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
12820 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f     /* An empty o
12830 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f  ption name. Igno
12840 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61  re this option a
12850 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20  ltogether. */.  
12860 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
12870 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
12880 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55  [iIn]!='#' && zU
12890 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29  ri[iIn-1]!='&' )
128a0 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
128b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
128c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
128d0 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20  ( c=='&' ){.    
128e0 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
128f0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
12900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12910 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b       eState = 2;
12920 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12930 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
12940 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74  }else if( (eStat
12950 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20  e==0 && c=='?') 
12960 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26  || (eState==2 &&
12970 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20   c=='&') ){.    
12980 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
12990 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20     eState = 1;. 
129a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
129b0 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a  le[iOut++] = c;.
129c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53      }.    if( eS
129d0 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b  tate==1 ) zFile[
129e0 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
129f0 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
12a00 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
12a10 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
12a20 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  0';..    /* Chec
12a30 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  k if there were 
12a40 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63  any options spec
12a50 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c  ified that shoul
12a60 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  d be interpreted
12a70 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f   .    ** here. O
12a80 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ptions that are 
12a90 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65  interpreted here
12aa0 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61   include "vfs" a
12ab0 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20  nd those that.  
12ac0 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20    ** correspond 
12ad0 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61  to flags that ma
12ae0 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  y be passed to t
12af0 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  he sqlite3_open_
12b00 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68  v2().    ** meth
12b10 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20  od. */.    zOpt 
12b20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33  = &zFile[sqlite3
12b30 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
12b40 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1];.    while( z
12b50 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Opt[0] ){.      
12b60 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74  int nOpt = sqlit
12b70 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29  e3Strlen30(zOpt)
12b80 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
12b90 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b  al = &zOpt[nOpt+
12ba0 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56  1];.      int nV
12bb0 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  al = sqlite3Strl
12bc0 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20  en30(zVal);..   
12bd0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26     if( nOpt==3 &
12be0 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20  & memcmp("vfs", 
12bf0 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  zOpt, 3)==0 ){. 
12c00 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56         zVfs = zV
12c10 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  al;.      }else{
12c20 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12c30 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20  OpenMode {.     
12c40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
12c50 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *z;.          in
12c60 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  t mode;.        
12c70 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  } *aMode = 0;.  
12c80 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64        char *zMod
12c90 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20  eType = 0;.     
12ca0 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b     int mask = 0;
12cb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  .        int lim
12cc0 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  it = 0;..       
12cd0 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20   if( nOpt==5 && 
12ce0 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20  memcmp("cache", 
12cf0 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20  zOpt, 5)==0 ){. 
12d00 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
12d10 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
12d20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b  aCacheMode[] = {
12d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
12d40 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45  shared",  SQLITE
12d50 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
12d60 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
12d70 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51   { "private", SQ
12d80 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
12d90 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
12da0 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
12db0 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
12dc0 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
12dd0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
12de0 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CACHE|SQLITE_OPE
12df0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a  N_PRIVATECACHE;.
12e00 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
12e10 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20  = aCacheMode;.  
12e20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
12e30 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
12e40 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63  zModeType = "cac
12e50 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  he";.        }. 
12e60 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
12e70 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f  =4 && memcmp("mo
12e80 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30  de", zOpt, 4)==0
12e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
12ea0 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
12eb0 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d  Mode aOpenMode[]
12ec0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
12ed0 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45   { "ro",  SQLITE
12ee0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d  _OPEN_READONLY }
12ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
12f00 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "rw",  SQLITE_OP
12f10 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20  EN_READWRITE }, 
12f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
12f30 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  rwc", SQLITE_OPE
12f40 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
12f50 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
12f60 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
12f70 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49  { "memory", SQLI
12f80 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d  TE_OPEN_MEMORY }
12f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
12fa0 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
12fb0 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
12fc0 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
12fd0 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c  N_READONLY | SQL
12fe0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12ff0 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  TE.             
13000 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
13010 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
13020 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b  ITE_OPEN_MEMORY;
13030 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
13040 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20   = aOpenMode;.  
13050 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
13060 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20  mask & flags;.  
13070 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
13080 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20  e = "access";.  
13090 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
130a0 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20   if( aMode ){.  
130b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
130c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
130d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
130e0 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b   for(i=0; aMode[
130f0 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i].z; i++){.    
13100 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
13110 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d  ar *z = aMode[i]
13120 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .z;.            
13130 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65  if( nVal==sqlite
13140 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20  3Strlen30(z) && 
13150 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20  0==memcmp(zVal, 
13160 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20  z, nVal) ){.    
13170 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d            mode =
13180 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a   aMode[i].mode;.
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
131a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
131b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
131c0 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64           if( mod
131d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
131e0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
131f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
13200 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65  "no such %s mode
13210 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65  : %s", zModeType
13220 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
13230 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13240 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
13250 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
13260 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
13270 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
13280 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54  ( (mode & ~SQLIT
13290 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c  E_OPEN_MEMORY)>l
132a0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
132b0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
132c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
132d0 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c  "%s mode not all
132e0 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20  owed: %s",.     
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56     zModeType, zV
13320 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
13330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52   rc = SQLITE_PER
13340 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
13350 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
13360 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
13370 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d           flags =
13380 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29   (flags & ~mask)
13390 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20   | mode;.       
133a0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
133b0 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e    zOpt = &zVal[n
133c0 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20  Val+1];.    }.. 
133d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c   }else{.    zFil
133e0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
133f0 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20  oc(nUri+2);.    
13400 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
13410 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13420 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69  ;.    memcpy(zFi
13430 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  le, zUri, nUri);
13440 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d  .    zFile[nUri]
13450 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
13460 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30  le[nUri+1] = '\0
13470 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ';.    flags &= 
13480 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  ~SQLITE_OPEN_URI
13490 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20  ;.  }..  *ppVfs 
134a0 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
134b0 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
134c0 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20  *ppVfs==0 ){.   
134d0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
134e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
134f0 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
13500 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  zVfs);.    rc = 
13510 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13520 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  }. parse_uri_out
13530 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
13540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
13550 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29  ite3_free(zFile)
13560 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b  ;.    zFile = 0;
13570 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d  .  }.  *pFlags =
13580 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c   flags;.  *pzFil
13590 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74  e = zFile;.  ret
135a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
135b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
135c0 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
135d0 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
135e0 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
135f0 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
13600 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
13610 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
13620 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
13630 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
13640 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
13650 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
13660 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
13670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
13680 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
13690 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
136a0 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
136b0 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
136c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
136d0 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
136e0 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
136f0 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  ned int flags,  
13700 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
13710 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
13720 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
13730 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13740 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
13750 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
13760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13770 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c       /* Store al
13780 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68  located handle h
13790 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ere */.  int rc;
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
137c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
137d0 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20   isThreadsafe;  
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
137f0 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73  True for threads
13800 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  afe connections 
13810 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e  */.  char *zOpen
13820 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13830 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
13840 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   argument to pas
13850 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29  s to BtreeOpen()
13860 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   */.  char *zErr
13870 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Msg = 0;        
13880 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
13890 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69  essage from sqli
138a0 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f  te3ParseUri() */
138b0 0a 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23  ..  *ppDb = 0;.#
138c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
138d0 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
138e0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
138f0 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
13900 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
13910 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  endif..  /* Only
13920 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20   allow sensible 
13930 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
13940 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67  bits in the flag
13950 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20  s argument.  .  
13960 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  ** Throw an erro
13970 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e  r if any non-sen
13980 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69  se combination i
13990 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20  s used.  If we. 
139a0 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b   ** do not block
139b0 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61   illegal combina
139c0 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63  tions here, it c
139d0 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a  ould trigger.  *
139e0 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  * assert() state
139f0 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20  ments in deeper 
13a00 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c  layers.  Sensibl
13a10 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20  e combinations. 
13a20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20   ** are:.  **.  
13a30 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f  **  1:  SQLITE_O
13a40 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a  PEN_READONLY.  *
13a50 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  2:  SQLITE_OP
13a60 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a  EN_READWRITE.  *
13a70 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  6:  SQLITE_OP
13a80 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
13a90 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13aa0 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  E.  */.  assert(
13ab0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13ac0 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29  DONLY  == 0x01 )
13ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
13ae0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13af0 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61  E == 0x02 );.  a
13b00 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
13b10 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20  EN_CREATE    == 
13b20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61  0x04 );.  testca
13b30 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
13b40 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52  ))==0x02 ); /* R
13b50 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73  EADONLY */.  tes
13b60 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
13b70 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f  s&7))==0x04 ); /
13b80 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20  * READWRITE */. 
13b90 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
13ba0 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20  flags&7))==0x40 
13bb0 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
13bc0 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66  | CREATE */.  if
13bd0 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  ( ((1<<(flags&7)
13be0 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72  ) & 0x46)==0 ) r
13bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
13c00 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28  USE_BKPT;..  if(
13c10 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13c20 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d  nfig.bCoreMutex=
13c30 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  =0 ){.    isThre
13c40 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
13c50 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
13c60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
13c70 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72  TEX ){.    isThr
13c80 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
13c90 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
13ca0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
13cb0 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  LMUTEX ){.    is
13cc0 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a  Threadsafe = 1;.
13cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54    }else{.    isT
13ce0 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69  hreadsafe = sqli
13cf0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13d00 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a  bFullMutex;.  }.
13d10 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
13d20 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
13d30 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c  ECACHE ){.    fl
13d40 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
13d50 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
13d60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
13d70 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13d80 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
13d90 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  led ){.    flags
13da0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
13db0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
13dc0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61  ..  /* Remove ha
13dd0 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20  rmful bits from 
13de0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
13df0 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ter.  **.  ** Th
13e00 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  e SQLITE_OPEN_NO
13e10 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45  MUTEX and SQLITE
13e20 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
13e30 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20  flags were.  ** 
13e40 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68  dealt with in th
13e50 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20  e previous code 
13e60 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20  block.  Besides 
13e70 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a  these, the only.
13e80 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74    ** valid input
13e90 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   flags for sqlit
13ea0 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65  e3_open_v2() are
13eb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13ec0 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49  DONLY,.  ** SQLI
13ed0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13ee0 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  E, SQLITE_OPEN_C
13ef0 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  REATE, SQLITE_OP
13f00 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a  EN_SHAREDCACHE,.
13f10 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
13f20 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61  _PRIVATECACHE, a
13f30 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64  nd some reserved
13f40 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79   bits.  Silently
13f50 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61   mask.  ** off a
13f60 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a  ll other flags..
13f70 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20    */.  flags &= 
13f80 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ~( SQLITE_OPEN_
13f90 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13fb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
13fc0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
13fd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13fe0 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20  N_MAIN_DB |.    
13ff0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
14000 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
14010 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14020 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
14030 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20  NSIENT_DB | .   
14040 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14050 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
14060 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
14070 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
14080 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
14090 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
140a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
140b0 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  BJOURNAL | .    
140c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
140d0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
140e0 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20  URNAL |.        
140f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
14100 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20  EN_NOMUTEX |.   
14110 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14120 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
14130 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
14140 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57     SQLITE_OPEN_W
14150 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  AL.             
14160 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14170 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
14180 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
14190 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   db = sqlite3Mal
141a0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
141b0 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66  sqlite3) );.  if
141c0 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f  ( db==0 ) goto o
141d0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28  pendb_out;.  if(
141e0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b   isThreadsafe ){
141f0 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d  .    db->mutex =
14200 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
14210 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
14220 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
14230 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30  if( db->mutex==0
14240 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14250 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20  3_free(db);.    
14260 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20    db = 0;.      
14270 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
14290 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
142a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
142b0 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66  b->errMask = 0xf
142c0 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32  f;.  db->nDb = 2
142d0 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
142e0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
142f0 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  Y;.  db->aDb = d
14300 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20  b->aDbStatic;.. 
14310 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14320 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a  db->aLimit)==siz
14330 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20  eof(aHardLimit) 
14340 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  );.  memcpy(db->
14350 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d  aLimit, aHardLim
14360 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  it, sizeof(db->a
14370 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61  Limit));.  db->a
14380 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
14390 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63   db->nextAutovac
143a0 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d   = -1;.  db->szM
143b0 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  map = sqlite3Glo
143c0 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
143d0 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  ;.  db->nextPage
143e0 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  size = 0;.  db->
143f0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
14400 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
14410 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
14420 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61  gger | SQLITE_Ca
14430 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65  cheSpill.#if !de
14440 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46  fined(SQLITE_DEF
14450 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
14460 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f  NDEX) || SQLITE_
14470 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49  DEFAULT_AUTOMATI
14480 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20  C_INDEX.        
14490 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
144a0 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64  E_AutoIndex.#end
144b0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
144c0 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41  FAULT_FILE_FORMA
144d0 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20  T<4.            
144e0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65       | SQLITE_Le
144f0 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64  gacyFileFmt.#end
14500 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
14510 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
14520 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ENSION.         
14530 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
14540 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23  _LoadExtension.#
14550 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
14560 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49  _DEFAULT_RECURSI
14570 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20  VE_TRIGGERS.    
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
14590 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
145a0 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
145b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
145c0 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
145d0 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41  ) && SQLITE_DEFA
145e0 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
145f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14600 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69    | SQLITE_Forei
14610 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20 20  gnKeys.#endif.  
14620 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48      ;.  sqlite3H
14630 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f  ashInit(&db->aCo
14640 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
14650 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14660 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
14670 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
14680 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
14690 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64  ..  /* Add the d
146a0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
146b0 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
146c0 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66  . BINARY works f
146d0 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20  or both UTF-8.  
146e0 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73  ** and UTF-16, s
146f0 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20  o add a version 
14700 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69  for each to avoi
14710 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72  d any unnecessar
14720 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f  y.  ** conversio
14730 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72  ns. The only err
14740 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75  or that can occu
14750 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c  r here is a mall
14760 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20  oc() failure..  
14770 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  */.  createColla
14780 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
14790 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
147a0 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
147b0 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
147c0 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
147d0 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  Y", SQLITE_UTF16
147e0 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  BE, 0, binCollFu
147f0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
14800 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
14810 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
14820 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16LE, 0, binCo
14830 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
14840 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
14850 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54  , "RTRIM", SQLIT
14860 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31  E_UTF8, (void*)1
14870 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
14880 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
14890 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
148a0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
148b0 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c  ;.  }.  db->pDfl
148c0 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  tColl = sqlite3F
148d0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  indCollSeq(db, S
148e0 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e  QLITE_UTF8, "BIN
148f0 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65  ARY", 0);.  asse
14900 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  rt( db->pDfltCol
14910 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  l!=0 );..  /* Al
14920 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20 63  so add a UTF-8 c
14930 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
14940 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14950 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ce. */.  createC
14960 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
14970 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
14980 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
14990 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
149a0 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
149b0 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67  filename/URI arg
149c0 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e  ument. */.  db->
149d0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67  openFlags = flag
149e0 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  s;.  rc = sqlite
149f0 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20  3ParseUri(zVfs, 
14a00 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67  zFilename, &flag
14a10 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a  s, &db->pVfs, &z
14a20 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Open, &zErrMsg);
14a30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
14a50 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
14a60 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   ) db->mallocFai
14a70 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  led = 1;.    sql
14a80 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
14a90 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  , zErrMsg ? "%s"
14aa0 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a   : 0, zErrMsg);.
14ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14ac0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67  (zErrMsg);.    g
14ad0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
14ae0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
14af0 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
14b00 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
14b10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
14b20 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
14b30 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e  zOpen, db, &db->
14b40 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20  aDb[0].pBt, 0,. 
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53         flags | S
14b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
14b80 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  DB);.  if( rc!=S
14b90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14ba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
14bb0 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
14bc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14bd0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
14be0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
14bf0 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f  , rc, 0);.    go
14c00 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
14c10 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e   }.  db->aDb[0].
14c20 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
14c30 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64  3SchemaGet(db, d
14c40 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
14c50 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63    db->aDb[1].pSc
14c60 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
14c70 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a  hemaGet(db, 0);.
14c80 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
14c90 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
14ca0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
14cb0 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b  abase is 'full';
14cc0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
14cd0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
14ce0 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d  s 'NONE'. This m
14cf0 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72  atches the pager
14d00 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e   layer defaults.
14d10 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44    .  */.  db->aD
14d20 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61  b[0].zName = "ma
14d30 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
14d40 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
14d50 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d   3;.  db->aDb[1]
14d60 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
14d70 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
14d80 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a  fety_level = 1;.
14d90 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
14da0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
14db0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14dc0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14dd0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14de0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
14df0 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
14e00 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
14e10 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
14e20 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
14e30 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
14e40 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
14e50 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
14e60 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
14e70 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
14e80 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
14e90 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
14ea0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
14eb0 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
14ec0 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  rBuiltinFunction
14ed0 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  s(db);..  /* Loa
14ee0 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65  d automatic exte
14ef0 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69  nsions - extensi
14f00 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ons that have be
14f10 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20  en registered.  
14f20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
14f30 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65  ite3_automatic_e
14f40 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a  xtension() API..
14f50 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
14f60 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
14f70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
14f90 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e  te3AutoLoadExten
14fa0 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72  sions(db);.    r
14fb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
14fc0 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ode(db);.    if(
14fd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14fe0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  {.      goto ope
14ff0 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
15000 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
15010 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20  E_ENABLE_FTS1.  
15020 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
15030 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74  ailed ){.    ext
15040 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
15050 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts1Init(sqlite3*
15060 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15070 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b  te3Fts1Init(db);
15080 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
15090 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
150a0 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62  E_FTS2.  if( !db
150b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
150c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
150d0 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
150e0 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  t sqlite3Fts2Ini
150f0 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
15100 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
15110 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  2Init(db);.  }.#
15120 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
15130 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
15140 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
15150 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
15160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
15180 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  3Init(db);.  }.#
15190 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
151a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a  LITE_ENABLE_ICU.
151b0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
151c0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
151d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
151e0 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49  rc = sqlite3IcuI
151f0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
15200 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
15210 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
15220 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
15230 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
15240 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
15250 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65  c = sqlite3Rtree
15260 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
15270 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c  ndif..  /* -DSQL
15280 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
15290 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
152a0 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
152b0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
152c0 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
152d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
152e0 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
152f0 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
15300 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
15310 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
15320 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
15330 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
15340 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
15350 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
15360 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
15370 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
15380 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
15390 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
153a0 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
153b0 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
153c0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
153d0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
153e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
153f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15400 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
15410 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
15420 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c  ..  if( rc ) sql
15430 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
15440 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62  , 0);..  /* Enab
15450 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
15460 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
15470 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
15480 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
15490 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
154a0 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
154d0 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
154e0 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
154f0 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
15500 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
15510 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
15520 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
15530 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  endb_out:.  sqli
15540 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b  te3_free(zOpen);
15550 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
15560 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
15570 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
15580 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  dsafe==0 || sqli
15590 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
155a0 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
155b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
155c0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
155d0 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
155e0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
155f0 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
15600 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
15610 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
15620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
15630 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
15640 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
15650 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
15660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15670 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
15680 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
15690 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a  IC_SICK;.  }.  *
156a0 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65  ppDb = db;.#ifde
156b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
156c0 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
156d0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
156e0 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
156f0 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20  /* Opening a db 
15700 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
15710 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
15720 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69  ed 0. */.    voi
15730 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65  d *pArg = sqlite
15740 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
15750 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71  qllogArg;.    sq
15760 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15770 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20  g.xSqllog(pArg, 
15780 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  db, zFilename, 0
15790 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
157a0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
157b0 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
157c0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
157d0 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
157e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
157f0 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  3_open(.  const 
15800 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
15810 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
15820 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Db .){.  return 
15830 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
15840 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20  lename, ppDb,.  
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
15870 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
15880 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
15890 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
158a0 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e  3_open_v2(.  con
158b0 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
158c0 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e,   /* Database
158d0 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38   filename (UTF-8
158e0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
158f0 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f  *ppDb,         /
15900 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62  * OUT: SQLite db
15910 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
15920 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
15930 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f       /* Flags */
15940 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15950 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  Vfs        /* Na
15960 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65  me of VFS module
15970 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
15980 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
15990 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70  ase(filename, pp
159a0 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  Db, (unsigned in
159b0 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  t)flags, zVfs);.
159c0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
159d0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
159e0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
159f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
15a00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
15a10 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f  en16(.  const vo
15a20 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  id *zFilename, .
15a30 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
15a40 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
15a50 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20   *zFilename8;   
15a60 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63  /* zFilename enc
15a70 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e  oded in UTF-8 in
15a80 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20  stead of UTF-16 
15a90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
15aa0 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
15ab0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a  rc;..  assert( z
15ac0 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73  Filename );.  as
15ad0 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20  sert( ppDb );.  
15ae0 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
15af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15b00 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
15b10 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
15b20 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
15b30 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
15b40 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  f.  pVal = sqlit
15b50 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
15b60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
15b70 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
15b80 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
15b90 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
15ba0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
15bb0 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
15bc0 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
15bd0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
15be0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
15bf0 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
15c00 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
15c10 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
15c40 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
15c50 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
15c60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
15c70 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
15c80 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
15c90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15ca0 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
15cb0 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
15cc0 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
15cd0 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70 44  {.      ENC(*ppD
15ce0 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  b) = SQLITE_UTF1
15cf0 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20  6NATIVE;.    }. 
15d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
15d10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15d20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75   }.  sqlite3Valu
15d30 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
15d40 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
15d50 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
15d60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15d70 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
15d80 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
15d90 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
15da0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
15db0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15dc0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
15dd0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
15de0 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
15df0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
15e00 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
15e10 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
15e20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
15e30 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
15e40 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
15e50 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
15e60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
15e70 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15e80 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
15e90 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
15ea0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
15eb0 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
15ec0 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
15ed0 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
15ee0 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20  mpare, 0);.  rc 
15ef0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
15f00 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
15f10 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15f20 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
15f30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15f40 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
15f50 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
15f60 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
15f70 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
15f80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
15f90 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
15fa0 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
15fb0 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
15fc0 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
15fd0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
15fe0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
15ff0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
16000 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
16010 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
16020 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
16030 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
16040 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16050 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
16060 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
16070 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
16080 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
16090 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
160a0 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
160b0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
160c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
160d0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
160e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
160f0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
16100 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
16110 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
16120 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
16130 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
16140 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
16150 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
16160 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
16170 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
16180 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
16190 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
161a0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
161b0 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
161c0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
161d0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
161e0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
161f0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
16200 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
16210 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16220 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
16230 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame8;.  sqlite3_
16240 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
16250 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
16260 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
16270 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
16280 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
16290 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
162a0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
162b0 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
162c0 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
162d0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
162e0 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
162f0 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
16300 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
16310 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
16320 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
16330 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
16340 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
16350 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16360 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
16370 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
16380 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16390 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
163a0 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
163b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
163c0 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
163d0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
163e0 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
163f0 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
16400 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
16410 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16420 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
16430 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
16440 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
16450 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
16460 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
16470 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
16480 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
16490 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
164a0 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
164b0 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
164c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
164d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
164e0 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
164f0 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
16500 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
16510 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
16520 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
16530 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
16540 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
16550 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
16560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16570 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
16580 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
16590 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
165a0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
165b0 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
165c0 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
165d0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
165e0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
165f0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
16600 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
16610 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
16620 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
16630 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
16640 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
16650 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
16660 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
16670 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
16680 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
16690 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
166a0 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
166b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
166c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
166d0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
166e0 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
166f0 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
16700 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
16710 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
16720 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
16730 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
16740 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
16750 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
16760 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
16770 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16780 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
16790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
167a0 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
167b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
167c0 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
167d0 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
167e0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
167f0 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
16800 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
16810 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
16820 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
16830 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
16840 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
16850 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
16860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16870 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16880 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
16890 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
168a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
168b0 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
168c0 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
168d0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
168e0 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
168f0 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
16900 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
16910 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
16920 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
16930 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
16940 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
16950 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
16960 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
16970 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74  ROLLBACK..*/.int
16980 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
16990 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
169a0 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
169b0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d  b->autoCommit;.}
169c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
169d0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
169e0 72 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f  re subtitutes fo
169f0 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
16a00 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
16a10 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
16a20 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
16a30 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
16a40 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
16a50 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
16a60 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20  s.  They server 
16a70 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a  two purposes:.**
16a80 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20  .**   1.  Serve 
16a90 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  as a convenient 
16aa0 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
16ab0 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64  reakpoint in a d
16ac0 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  ebugger.**      
16ad0 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
16ae0 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f  version error co
16af0 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e  nditions occurs.
16b00 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76  .**.**   2.  Inv
16b10 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  oke sqlite3_log(
16b20 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  ) to provide the
16b30 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63   source code loc
16b40 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20  ation where.**  
16b50 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c       a low-level
16b60 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20   error is first 
16b70 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74  detected..*/.int
16b80 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45   sqlite3CorruptE
16b90 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
16ba0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
16bb0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16bc0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
16bd0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
16be0 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20  E_CORRUPT,.     
16bf0 20 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61           "databa
16c00 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74  se corruption at
16c10 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
16c20 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
16c30 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
16c40 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
16c50 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
16c60 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69  ITE_CORRUPT;.}.i
16c70 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65  nt sqlite3Misuse
16c80 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
16c90 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
16ca0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16cb0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
16cc0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
16cd0 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20  TE_MISUSE, .    
16ce0 20 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73            "misus
16cf0 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
16d00 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
16d10 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
16d20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
16d30 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
16d40 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
16d50 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
16d60 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
16d70 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
16d80 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
16d90 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
16da0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  );.  sqlite3_log
16db0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
16dc0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
16dd0 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
16de0 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  le at line %d of
16df0 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
16e00 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
16e10 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
16e20 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
16e30 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
16e40 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N;.}...#ifndef S
16e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
16e60 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
16e70 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
16e80 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
16e90 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
16ea0 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
16eb0 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
16ec0 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
16ed0 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
16ee0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
16ef0 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
16f00 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
16f10 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
16f20 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
16f30 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
16f40 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
16f50 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
16f60 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
16f70 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
16f80 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
16f90 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
16fa0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
16fb0 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
16fc0 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
16fd0 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
16fe0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
16ff0 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
17000 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
17010 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ils..*/.#ifdef S
17020 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
17030 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74  UMN_METADATA.int
17040 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
17050 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
17060 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17080 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
17090 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
170a0 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
170b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
170c0 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
170d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
170e0 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
170f0 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
17100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
17110 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
17120 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
17130 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
17140 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
17150 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
17160 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
17170 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
17180 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
17190 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
171a0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
171b0 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
171c0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
171d0 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
171e0 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
171f0 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
17200 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
17210 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
17220 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
17230 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
17240 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
17250 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
17260 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
17270 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
17280 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
17290 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
172a0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
172b0 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
172c0 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
172d0 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
172e0 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72  nt iCol;..  char
172f0 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
17300 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
17310 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
17320 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
17330 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
17340 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
17350 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
17360 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
17370 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
17380 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
17390 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
173a0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
173b0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
173c0 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
173d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
173e0 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
173f0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
17400 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
17410 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
17420 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
17430 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
17440 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
17450 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17460 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
17470 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
17480 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
17490 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
174a0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
174b0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
174c0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
174d0 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
174e0 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
174f0 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ted */.  if( sql
17500 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
17510 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
17520 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
17530 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ey;.    if( iCol
17540 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  >=0 ){.      pCo
17550 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
17560 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iCol];.    }.  }
17570 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
17580 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
17590 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
175a0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
175b0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
175c0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
175d0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
175e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
175f0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
17600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17610 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
17620 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
17630 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30  {.      pTab = 0
17640 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72  ;.      goto err
17650 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
17660 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
17670 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
17680 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
17690 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
176a0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
176b0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
176c0 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
176d0 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
176e0 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
176f0 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
17700 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
17710 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
17720 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
17730 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
17740 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
17750 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
17760 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
17770 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
17780 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
17790 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
177a0 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
177b0 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
177c0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
177d0 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
177e0 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
177f0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
17800 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
17810 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
17820 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
17830 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
17840 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
17850 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
17860 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
17870 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f   zDataType = pCo
17880 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43  l->zType;.    zC
17890 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
178a0 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
178b0 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
178c0 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
178d0 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63  ykey  = (pCol->c
178e0 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
178f0 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20  G_PRIMKEY)!=0;. 
17900 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
17910 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
17920 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
17930 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
17940 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
17950 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
17960 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
17970 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
17980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
17990 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
179a0 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
179b0 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
179c0 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
179d0 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
179e0 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
179f0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
17a00 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
17a10 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
17a20 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
17a30 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
17a40 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
17a50 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
17a60 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
17a70 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
17a80 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
17a90 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
17aa0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
17ab0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
17ac0 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
17ad0 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
17ae0 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
17af0 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
17b00 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
17b10 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
17b20 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
17b30 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
17b40 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
17b50 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
17b60 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
17b70 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
17b80 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
17b90 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
17ba0 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
17bb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
17bc0 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
17bd0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
17be0 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
17bf0 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
17c00 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
17c10 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
17c20 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
17c30 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
17c40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
17c50 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  ror(db, rc, (zEr
17c60 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
17c70 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
17c80 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
17c90 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
17ca0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
17cb0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
17cc0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
17cd0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
17ce0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
17cf0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
17d00 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
17d10 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
17d20 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
17d30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
17d40 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
17d50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
17d60 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
17d70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
17d80 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
17d90 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
17da0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
17db0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
17dc0 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
17dd0 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
17de0 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
17df0 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
17e00 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
17e10 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
17e20 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
17e30 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
17e40 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
17e50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17e60 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
17e70 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
17e80 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
17e90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
17ea0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
17eb0 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
17ec0 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20  b, int onoff){. 
17ed0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17ee0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
17ef0 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
17f00 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
17f10 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
17f20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
17f30 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
17f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
17f60 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
17f70 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
17f80 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
17f90 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
17fa0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
17fb0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
17fc0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
17fd0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
17fe0 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
17ff0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
18000 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
18010 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
18020 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
18030 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73  x);.  pBtree = s
18040 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
18050 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
18060 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
18070 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
18080 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
18090 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73  _file *fd;.    s
180a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
180b0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50  (pBtree);.    pP
180c0 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
180d0 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
180e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
180f0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66  ager!=0 );.    f
18100 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
18110 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
18120 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
18130 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
18140 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
18150 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
18160 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
18170 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
18180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18190 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
181a0 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
181b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
181c0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
181d0 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
181e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
181f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18200 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
18210 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18220 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
18230 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18240 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
18250 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
18260 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65    .}../*.** Inte
18270 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
18280 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
18290 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
182a0 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
182b0 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
182c0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
182d0 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
182e0 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
182f0 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
18300 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
18310 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
18320 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
18330 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
18340 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
18350 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18360 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
18370 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
18380 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
18390 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
183a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
183b0 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
183c0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
183d0 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
183e0 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
183f0 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
18400 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
18410 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
18420 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
18430 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
18440 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
18450 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
18460 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
18470 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
18480 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
18490 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
184a0 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
184b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
184c0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
184d0 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
184e0 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
184f0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
18500 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
18510 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
18520 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
18530 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
18540 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
18550 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
18560 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
18570 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
18580 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
18590 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
185a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
185b0 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
185c0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
185d0 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62  ss(0,0);.      b
185e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
185f0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
18600 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
18610 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
18620 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
18630 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
18640 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
18650 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
18660 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
18670 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
18680 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
18690 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
186a0 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
186b0 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
186c0 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
186d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
186e0 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
186f0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
18700 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
18710 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
18720 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
18730 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
18740 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
18750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18760 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
18770 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
18780 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
18790 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
187a0 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
187b0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
187c0 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
187d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
187e0 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
187f0 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
18800 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
18810 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
18820 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55  test_control(FAU
18830 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c  LT_INSTALL, xCal
18840 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20  lback).    **.  
18850 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20    ** Arrange to 
18860 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b  invoke xCallback
18870 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69  () whenever sqli
18880 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73  te3FaultSim() is
18890 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20   called,.    ** 
188a0 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20  if xCallback is 
188b0 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
188c0 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73  .    ** As a tes
188d0 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73  t of the fault s
188e0 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69  imulator mechani
188f0 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74  sm itself, sqlit
18900 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20  e3FaultSim(0).  
18910 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69    ** is called i
18920 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
18930 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20   installing the 
18940 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64  new callback and
18950 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20   the return.    
18960 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71  ** value from sq
18970 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
18980 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74   becomes the ret
18990 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  urn from.    ** 
189a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
189b0 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  trol()..    */. 
189c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
189d0 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e  ESTCTRL_FAULT_IN
189e0 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f  STALL: {.      /
189f0 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
18a00 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
18a10 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
18a20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
18a30 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
18a40 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
18a50 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
18a60 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18a70 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b  ig.xTestCallback
18a80 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
18a90 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20  t(*)(int));.    
18aa0 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
18ab0 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c  ef int(*TESTCALL
18ac0 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29  BACKFUNC_t)(int)
18ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
18ae0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
18af0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
18b00 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42  rg(ap, TESTCALLB
18b10 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  ACKFUNC_t);.    
18b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61    rc = sqlite3Fa
18b30 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20  ultSim(0);.     
18b40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18b50 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
18b60 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
18b70 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  ol(BENIGN_MALLOC
18b80 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20  _HOOKS, xBegin, 
18b90 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  xEnd).    **.   
18ba0 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f   ** Register hoo
18bb0 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e  ks to call to in
18bc0 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c  dicate which mal
18bd0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a  loc() failures .
18be0 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67      ** are benig
18bf0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
18c00 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
18c10 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
18c20 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20  _HOOKS: {.      
18c30 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76  typedef void (*v
18c40 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f  oid_function)(vo
18c50 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  id);.      void_
18c60 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
18c70 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69  Begin;.      voi
18c80 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
18c90 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65  gnEnd;.      xBe
18ca0 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61  nignBegin = va_a
18cb0 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
18cc0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65  tion);.      xBe
18cd0 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67  nignEnd = va_arg
18ce0 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
18cf0 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
18d00 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f  e3BenignMallocHo
18d10 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e  oks(xBenignBegin
18d20 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20  , xBenignEnd);. 
18d30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18d40 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
18d50 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
18d60 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
18d70 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
18d80 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  YTE, unsigned in
18d90 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
18da0 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49  ** Set the PENDI
18db0 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76  NG byte to the v
18dc0 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75  alue in the argu
18dd0 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20  ment, if X>0..  
18de0 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61    ** Make no cha
18df0 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52  nges if X==0.  R
18e00 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
18e10 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62  of the pending b
18e20 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74  yte.    ** as it
18e30 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65   existing before
18e40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
18e50 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
18e60 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e  .    ** IMPORTAN
18e70 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  T:  Changing the
18e80 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72   PENDING byte fr
18e90 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65  om 0x40000000 re
18ea0 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20  sults in.    ** 
18eb0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
18ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
18ed0 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20  rmat.  Changing 
18ee0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
18ef0 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e  .    ** while an
18f00 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  y database conne
18f10 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65  ction is open re
18f20 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e  sults in undefin
18f30 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69  ed and.    ** di
18f40 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69  leterious behavi
18f50 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
18f60 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
18f70 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
18f80 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50  : {.      rc = P
18f90 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66  ENDING_BYTE;.#if
18fa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18fb0 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20  _WSD.      {.   
18fc0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
18fd0 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72  t newVal = va_ar
18fe0 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
18ff0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
19000 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
19010 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
19020 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23  ewVal;.      }.#
19030 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
19040 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
19050 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
19060 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
19070 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
19080 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20  SERT, int X).   
19090 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
190a0 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
190b0 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
190c0 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
190d0 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73  r not.    ** ass
190e0 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65  ert() was enable
190f0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
19100 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
19110 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20   and assert().  
19120 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c    ** is enabled,
19130 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
19140 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20   value is true. 
19150 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
19160 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  d.    ** assert(
19170 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
19180 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
19190 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49  alue is zero.  I
191a0 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61  f X is.    ** fa
191b0 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
191c0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
191d0 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20  n the assertion 
191e0 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20  fires and the.  
191f0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f    ** process abo
19200 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61  rts.  If X is fa
19210 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
19220 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
19230 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
19240 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
19250 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ro..    */.    c
19260 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19270 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20  TRL_ASSERT: {.  
19280 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74      volatile int
19290 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73   x = 0;.      as
192a0 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72  sert( (x = va_ar
192b0 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b  g(ap,int))!=0 );
192c0 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20  .      rc = x;. 
192d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
192e0 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
192f0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
19300 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
19310 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
19320 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
19330 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
19340 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
19350 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
19360 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20   how the ALWAYS 
19370 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52  and.    ** NEVER
19380 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66   macros were def
19390 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
193a0 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  time..    **.   
193b0 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   ** The return v
193c0 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58  alue is ALWAYS(X
193d0 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ).  .    **.    
193e0 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
193f0 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
19400 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
19410 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
19420 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
19430 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
19440 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
19450 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
19460 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
19470 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
19480 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
19490 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
194a0 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
194b0 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
194c0 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
194d0 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
194e0 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
194f0 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
19500 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
19510 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
19520 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
19530 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
19540 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
19550 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
19560 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
19570 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
19580 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
19590 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
195a0 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
195b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
195c0 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
195d0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
195e0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
195f0 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
19600 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
19610 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
19620 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
19630 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
19640 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
19650 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
19660 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
19670 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
19680 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
19690 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
196a0 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
196b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
196c0 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
196d0 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
196e0 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
196f0 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
19700 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
19710 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
19720 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
19730 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
19740 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
19750 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
19760 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
19770 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
19780 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
19790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
197a0 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
197b0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
197c0 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
197d0 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
197e0 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
197f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19800 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
19810 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
19820 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
19830 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57  ;.      rc = ALW
19840 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72  AYS(x);.      br
19850 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
19860 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69  /*.    **   sqli
19870 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
19880 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
19890 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20  _BYTEORDER);.   
198a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69   **.    ** The i
198b0 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20  nteger returned 
198c0 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65  reveals the byte
198d0 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f  -order of the co
198e0 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a  mputer on which.
198f0 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73      ** SQLite is
19900 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a   running:.    **
19910 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20  .    **       1 
19920 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
19930 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
19940 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a   run-time.    **
19950 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74        10     lit
19960 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
19970 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
19980 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30  me.    **  43210
19990 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
199a0 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
199b0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
199c0 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20      **  123410  
199d0 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
199e0 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
199f0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
19a00 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51   */ .    case SQ
19a10 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
19a20 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20  TEORDER: {.     
19a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54   rc = SQLITE_BYT
19a40 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c  EORDER*100 + SQL
19a50 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e  ITE_LITTLEENDIAN
19a60 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47  *10 + SQLITE_BIG
19a70 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72  ENDIAN;.      br
19a80 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
19a90 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
19aa0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
19ab0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
19ac0 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
19ad0 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
19ae0 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
19af0 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
19b00 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
19b10 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
19b20 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
19b30 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
19b40 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
19b50 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
19b60 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
19b70 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
19b80 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
19b90 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
19ba0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
19bb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
19bc0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
19bd0 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
19be0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
19bf0 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
19c00 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
19c10 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
19c20 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
19c30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19c40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
19c50 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19c60 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19c70 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
19c80 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
19c90 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
19ca0 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
19cb0 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
19cc0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
19cd0 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
19ce0 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
19cf0 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
19d00 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
19d10 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
19d20 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
19d30 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
19d40 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
19d50 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
19d60 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
19d70 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
19d80 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
19d90 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
19da0 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
19db0 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
19dc0 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
19dd0 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
19de0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
19df0 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
19e00 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
19e10 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
19e20 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
19e30 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
19e40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19e50 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
19e60 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
19e70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
19e80 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
19e90 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64  3*);.      db->d
19ea0 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36  bOptFlags = (u16
19eb0 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  )(va_arg(ap, int
19ec0 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20  ) & 0xffff);.   
19ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19ee0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
19ef0 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20  _KEYWORD.    /* 
19f00 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19f10 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
19f20 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20  CTRL_ISKEYWORD, 
19f30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
19f40 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
19f50 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b   If zWord is a k
19f60 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65  eyword recognize
19f70 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c  d by the parser,
19f80 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
19f90 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
19fa0 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  f keywords.  Or 
19fb0 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20  if zWord is not 
19fc0 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72  a keyword, retur
19fd0 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  n 0..    ** .   
19fe0 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65   ** This test fe
19ff0 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76  ature is only av
1a000 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61  ailable in the a
1a010 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63  malgamation sinc
1a020 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c  e.    ** the SQL
1a030 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61  ITE_N_KEYWORD ma
1a040 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  cro is not defin
1a050 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ed in this file 
1a060 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a  if SQLite.    **
1a070 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20   is built using 
1a080 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20  separate source 
1a090 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1a0a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1a0b0 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
1a0c0 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
1a0d0 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61  char *zWord = va
1a0e0 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
1a0f0 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  har*);.      int
1a100 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1a110 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20  en30(zWord);.   
1a120 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33     rc = (sqlite3
1a130 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a  KeywordCode((u8*
1a140 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49  )zWord, n)!=TK_I
1a150 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  D) ? SQLITE_N_KE
1a160 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20  YWORD : 0;.     
1a170 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1a180 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71  ndif ..    /* sq
1a190 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1a1a0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1a1b0 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
1a1c0 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72  , sz, &pNew, pFr
1a1d0 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ee);.    **.    
1a1e0 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e  ** Pass pFree in
1a1f0 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  to sqlite3Scratc
1a200 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a  hFree(). .    **
1a210 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c   If sz>0 then al
1a220 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68  locate a scratch
1a230 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65   buffer into pNe
1a240 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  w.  .    */.    
1a250 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1a260 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
1a270 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64  OC: {.      void
1a280 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77   *pFree, **ppNew
1a290 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
1a2a0 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72        sz = va_ar
1a2b0 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1a2c0 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67    ppNew = va_arg
1a2d0 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20  (ap, void**);.  
1a2e0 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61      pFree = va_a
1a2f0 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
1a300 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70       if( sz ) *p
1a310 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63  pNew = sqlite3Sc
1a320 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b  ratchMalloc(sz);
1a330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63  .      sqlite3Sc
1a340 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29  ratchFree(pFree)
1a350 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a360 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1a370 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1a380 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1a390 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1a3a0 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b  ULT, int onoff);
1a3b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1a3c0 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66  f parameter onof
1a3d0 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63  f is non-zero, c
1a3e0 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72 61  onfigure the wra
1a3f0 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c  ppers so that al
1a400 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  l.    ** subsequ
1a410 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63  ent calls to loc
1a420 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72  altime() and var
1a430 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f  iants fail. If o
1a440 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20  noff is zero,.  
1a450 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73    ** undo this s
1a460 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  etting..    */. 
1a470 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1a480 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
1a490 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20  E_FAULT: {.     
1a4a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a4b0 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46  nfig.bLocaltimeF
1a4c0 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70  ault = va_arg(ap
1a4d0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1a4e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
1a4f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1a500 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
1a510 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c  IN).    /*   sql
1a520 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1a530 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1a540 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 2c 0a  L_EXPLAIN_STMT,.
1a550 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1a570 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f 6e 73  lite3_stmt*,cons
1a580 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 2a  t char**);.    *
1a590 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f 6d 70  *.    ** If comp
1a5a0 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
1a5b0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
1a5c0 4c 41 49 4e 2c 20 65 61 63 68 20 73 71 6c 69 74  LAIN, each sqlit
1a5d0 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a 20 20  e3_stmt holds.  
1a5e0 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20 74 68    ** a string th
1a5f0 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
1a600 20 6f 70 74 69 6d 69 7a 65 64 20 70 61 72 73 65   optimized parse
1a610 20 74 72 65 65 2e 20 20 54 68 69 73 20 74 65 73   tree.  This tes
1a620 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20 2a 2a  t-control.    **
1a630 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
1a640 65 72 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e  er to that strin
1a650 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  g..    */.    ca
1a660 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1a670 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 3a  RL_EXPLAIN_STMT:
1a680 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a690 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 76  _stmt *pStmt = v
1a6a0 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1a6b0 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20 20 20  3_stmt*);.      
1a6c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 52  const char **pzR
1a6d0 65 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  et = va_arg(ap, 
1a6e0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20  const char**);. 
1a6f0 20 20 20 20 20 2a 70 7a 52 65 74 20 3d 20 73 71       *pzRet = sq
1a700 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61  lite3VdbeExplana
1a710 74 69 6f 6e 28 28 56 64 62 65 2a 29 70 53 74 6d  tion((Vdbe*)pStm
1a720 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1a730 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1a740 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1a750 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1a760 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
1a770 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29  ER_CORRUPT, int)
1a780 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1a790 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66  Set or clear a f
1a7a0 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74  lag that indicat
1a7b0 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61  es that the data
1a7c0 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77  base file is alw
1a7d0 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a  ays well-.    **
1a7e0 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65   formed and neve
1a7f0 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73  r corrupt.  This
1a800 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62   flag is clear b
1a810 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63  y default, indic
1a820 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  ating that.    *
1a830 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  * database files
1a840 20 6d 69 67 68 74 20 68 61 76 65 20 61 72 62 69   might have arbi
1a850 74 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e  trary corruption
1a860 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 66  .  Setting the f
1a870 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a  lag during.    *
1a880 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73 65 73  * testing causes
1a890 20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74 28   certain assert(
1a8a0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
1a8b0 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61  the code to be a
1a8c0 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20  ctivated.    ** 
1a8d0 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20  that demonstrat 
1a8e0 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65  invariants on we
1a8f0 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
1a900 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f  se files..    */
1a910 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1a920 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
1a930 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20  CORRUPT: {.     
1a940 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a950 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70  nfig.neverCorrup
1a960 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
1a970 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1a980 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
1a990 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1a9a0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1a9b0 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56  ESTCTRL_VDBE_COV
1a9c0 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b  ERAGE, xCallback
1a9d0 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20  , ptr);.    **. 
1a9e0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44     ** Set the VD
1a9f0 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1aa00 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f  back function to
1aa10 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20   xCallback with 
1aa20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20  context .    ** 
1aa30 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20  pointer ptr..   
1aa40 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1aa50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42  ITE_TESTCTRL_VDB
1aa60 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69  E_COVERAGE: {.#i
1aa70 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1aa80 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20  _COVERAGE.      
1aa90 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62  typedef void (*b
1aaa0 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28  ranch_callback)(
1aab0 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29  void*,int,u8,u8)
1aac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1aad0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
1aae0 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67  eBranch = va_arg
1aaf0 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62  (ap,branch_callb
1ab00 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ack);.      sqli
1ab10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ab20 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d  pVdbeBranchArg =
1ab30 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a   va_arg(ap,void*
1ab40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1ab50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ab60 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1ab70 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1ab80 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
1ab90 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  IT);.    **.    
1aba0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1abb0 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61  _OK if SQLite ha
1abc0 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
1abd0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52  ed and SQLITE_ER
1abe0 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f  ROR if.    ** no
1abf0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
1ac00 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ac10 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20  RL_ISINIT: {.   
1ac20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
1ac30 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
1ac40 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
1ac50 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1ac60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ac70 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
1ac80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ac90 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
1aca0 53 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  ST */.  return r
1acb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1acc0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f   is a utility ro
1acd0 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f  utine, useful to
1ace0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1acf0 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b  ions, that check
1ad00 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61  s.** to see if a
1ad10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1ad20 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f  as a URI that co
1ad30 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66  ntained a specif
1ad40 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72  ic query .** par
1ad50 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73  ameter, and if s
1ad60 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61  o obtains the va
1ad70 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79  lue of the query
1ad80 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
1ad90 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1ada0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1adb0 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72  filename pointer
1adc0 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65   passed into the
1add0 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68   xOpen().** meth
1ade0 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c  od of a VFS impl
1adf0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
1ae00 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74   zParam argument
1ae10 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1ae20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  the.** query par
1ae30 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20  ameter we seek. 
1ae40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1ae50 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
1ae60 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a  of the zParam.**
1ae70 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74   parameter if it
1ae80 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65   exists.  If the
1ae90 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20   parameter does 
1aea0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
1aeb0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
1aec0 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ns a NULL pointe
1aed0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
1aee0 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61   *sqlite3_uri_pa
1aef0 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68  rameter(const ch
1af00 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
1af10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1af20 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  m){.  if( zFilen
1af30 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
1af40 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  0;.  zFilename +
1af50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1af60 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1af70 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65  ;.  while( zFile
1af80 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
1af90 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46  nt x = strcmp(zF
1afa0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1afb0 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
1afc0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
1afd0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
1afe0 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20  1;.    if( x==0 
1aff0 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61  ) return zFilena
1b000 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  me;.    zFilenam
1b010 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
1b020 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
1b030 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  + 1;.  }.  retur
1b040 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
1b050 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76  turn a boolean v
1b060 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
1b070 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
1b080 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  nt sqlite3_uri_b
1b090 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61  oolean(const cha
1b0a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1b0b0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1b0c0 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20  , int bDflt){.  
1b0d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1b0e0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1b0f0 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1b100 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c   zParam);.  bDfl
1b110 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20  t = bDflt!=0;.  
1b120 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74  return z ? sqlit
1b130 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20  e3GetBoolean(z, 
1b140 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a  bDflt) : bDflt;.
1b150 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b160 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
1b170 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
1b180 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
1b190 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1b1a0 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34  qlite3_uri_int64
1b1b0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1b1c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  zFilename,    /*
1b1d0 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73   Filename as pas
1b1e0 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a  sed to xOpen */.
1b1f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1b200 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55  aram,       /* U
1b210 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75  RI parameter sou
1b220 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ght */.  sqlite3
1b230 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20  _int64 bDflt    
1b240 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20     /* return if 
1b250 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73  parameter is mis
1b260 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  sing */.){.  con
1b270 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1b280 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1b290 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
1b2a0 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  aram);.  sqlite3
1b2b0 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20  _int64 v;.  if( 
1b2c0 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f  z && sqlite3DecO
1b2d0 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29  rHexToI64(z, &v)
1b2e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b2f0 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20     bDflt = v;.  
1b300 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74  }.  return bDflt
1b310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b320 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e  n the Btree poin
1b330 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
1b340 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75  y zDbName.  Retu
1b350 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1b360 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a  ound..*/.Btree *
1b370 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1b380 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  tree(sqlite3 *db
1b390 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1b3a0 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  bName){.  int i;
1b3b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1b3c0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1b3d0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
1b3e0 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62  pBt.     && (zDb
1b3f0 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
1b400 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d  e3StrICmp(zDbNam
1b410 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  e, db->aDb[i].zN
1b420 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  ame)==0).    ){.
1b430 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d        return db-
1b440 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
1b450 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b460 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1b470 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
1b480 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1b490 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1b4a0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1b4b0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
1b4c0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1b4d0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
1b4e0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1b4f0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1b500 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73    Btree *pBt = s
1b510 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1b520 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1b530 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
1b540 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1b550 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
1b560 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1b570 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
1b580 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
1b590 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
1b5a0 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
1b5b0 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
1b5c0 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
1b5d0 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
1b5e0 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
1b5f0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1b600 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
1b610 65 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33  e *pBt = sqlite3
1b620 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1b630 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
1b640 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
1b650 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c  e3BtreeIsReadonl
1b660 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a     y(pBt) : -1;.}.