/ Hex Artifact Content
Login

Artifact 05bf368c934cc73d02906030846eb4d1818c10f7:


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 2f 2a 20 6e 6f 74 2d 70 72 69 76 61  .*/./* not-priva
08d0: 74 65 20 2a 2f 20 76 6f 69 64 20 28 2a 73 71 6c  te */ void (*sql
08e0: 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e  ite3IoTrace)(con
08f0: 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d  st char*, ...) =
0900: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
0910: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
0920: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
0930: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  le points to a s
0940: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
0950: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
0960: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20  directory, then 
0970: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77  that directory w
0980: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
0990: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  tore.** temporar
09a0: 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  y files..**.** S
09b0: 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41  ee also the "PRA
09c0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
09d0: 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f  irectory" SQL co
09e0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  mmand..*/.char *
09f0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
0a00: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a  ectory = 0;../*.
0a10: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0a20: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0a30: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0a40: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0a50: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0a60: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0a70: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0a80: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0a90: 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74  store.** all dat
0aa0: 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63  abase files spec
0ab0: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
0ac0: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a  ative pathname..
0ad0: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
0ae0: 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f  he "PRAGMA data_
0af0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
0b00: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
0b10: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64  .char *sqlite3_d
0b20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
0b30: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  0;../*.** Initia
0b40: 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a  lize SQLite.  .*
0b50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0b60: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
0b70: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
0b80: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0b90: 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e  tion,.** VFS, an
0ba0: 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
0bb0: 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ms prior to doin
0bc0: 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f  g any serious wo
0bd0: 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74  rk with.** SQLit
0be0: 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20  e.  But as long 
0bf0: 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f  as you do not co
0c00: 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54  mpile with SQLIT
0c10: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
0c20: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
0c30: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
0c40: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
0c50: 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63  key routines suc
0c60: 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  h as.** sqlite3_
0c70: 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  open().  .**.** 
0c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0c90: 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f  a no-op except o
0ca0: 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73 74  n its very first
0cb0: 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72   call for the pr
0cc0: 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72  ocess,.** or for
0cd0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
0ce0: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
0cf0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
0d00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
0d10: 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c  t thread to call
0d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
0d30: 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ns the initializ
0d40: 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70  ation to.** comp
0d50: 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73  letion.  If subs
0d60: 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20 63  equent threads c
0d70: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
0d80: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
0d90: 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20  t.** thread has 
0da0: 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69  finished the ini
0db0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
0dc0: 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ess, then the su
0dd0: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65  bsequent.** thre
0de0: 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  ads must block u
0df0: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
0e00: 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20 77  hread finishes w
0e10: 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ith the initiali
0e20: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  zation..**.** Th
0e30: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 6d  e first thread m
0e40: 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72  ight call this r
0e50: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
0e60: 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a  ly.  Recursive.*
0e70: 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20  * calls to this 
0e80: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
0e90: 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75  ot block, of cou
0ea0: 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  rse.  Otherwise 
0eb0: 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  the.** initializ
0ec0: 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f  ation process wo
0ed0: 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65  uld never comple
0ee0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20  te..**.** Let X 
0ef0: 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68 72  be the first thr
0f00: 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69  ead to enter thi
0f10: 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20  s routine.  Let 
0f20: 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  Y be some other.
0f30: 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e  ** thread.  Then
0f40: 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69   while the initi
0f50: 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  al invocation of
0f60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79   this routine by
0f70: 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c   X is.** incompl
0f80: 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75 69  ete, it is requi
0f90: 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  red that:.**.** 
0fa0: 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74     *  Calls to t
0fb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  his routine from
0fc0: 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e   Y must block un
0fd0: 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f  til the outer-mo
0fe0: 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c  st.**       call
0ff0: 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e   by X completes.
1000: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63  .**.**    *  Rec
1010: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
1020: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
1030: 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75 72  m thread X retur
1040: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  n immediately.**
1050: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 62         without b
1060: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
1070: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1080: 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45  ze(void){.  MUTE
1090: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
10a0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
10b0: 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   )       /* The 
10c0: 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65  main static mute
10d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  x */.  int rc;  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1110: 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  de */.#ifdef SQL
1120: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
1130: 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e   int bRunExtraIn
1140: 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  it = 0;         
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1160: 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   Extra initializ
1170: 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a  ation needed */.
1180: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
11a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73   rc = sqlite3_ws
11b0: 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29  d_init(4096, 24)
11c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
11e0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
11f0: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69  if..  /* If SQLi
1200: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  te is already co
1210: 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c  mpletely initial
1220: 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  ized, then this 
1230: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  call.  ** to sql
1240: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1250: 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  ) should be a no
1260: 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e  -op.  But the in
1270: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1280: 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65  * must be comple
1290: 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d  te.  So isInit m
12a0: 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75  ust not be set u
12b0: 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e  ntil the very en
12c0: 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72  d.  ** of this r
12d0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  outine..  */.  i
12e0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
12f0: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20  Config.isInit ) 
1300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1310: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
1320: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1330: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
1340: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
1350: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
1360: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
1370: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
1380: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
1390: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
13a0: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
13b0: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
13c0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
13d0: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
13e0: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
13f0: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
1400: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
1410: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
1420: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
1430: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
1440: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
1450: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
1460: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
1470: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1480: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
1490: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14a0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
14b0: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
14c0: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
14d0: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
14e0: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
14f0: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1500: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1510: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
1520: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
1530: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
1540: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
1550: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
1560: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
1570: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
1580: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
1590: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
15a0: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
15b0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
15c0: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
15d0: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
15e0: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
15f0: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1600: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
1610: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
1620: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1630: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1640: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
1650: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
1660: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
1670: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
1680: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
1690: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
16a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16b0: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
16c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
16d0: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
16f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1700: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1710: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1720: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1730: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1740: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
1750: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1760: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
1770: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
1780: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
1790: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
17a0: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
17b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
17d0: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
17e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17f0: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1800: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1810: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1830: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1850: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1860: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1870: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1880: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1890: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
18a0: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
18b0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
18c0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
18d0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
18e0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
18f0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1900: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1910: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1920: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1930: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1940: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1950: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1970: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1980: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1990: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
19a0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
19b0: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
19c0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
19d0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
19e0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
19f0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1a00: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1a10: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1a20: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a30: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1a40: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1a50: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1a60: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1a70: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1a80: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1a90: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1aa0: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1ab0: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1ac0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1ad0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1ae0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1af0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1b00: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1b10: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1b20: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1b30: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1b40: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1b50: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1b60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1b70: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1b80: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1b90: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1ba0: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1bb0: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1bc0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1bd0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1be0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1bf0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1c00: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1c10: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1c20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c30: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1c40: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1c50: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1c60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1c70: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1c80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c90: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1ca0: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1cb0: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1cc0: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1cd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1ce0: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1cf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d00: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1d10: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1d20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1d30: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1d40: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
1d50: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
1d60: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
1d70: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1d80: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1d90: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
1da0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1db0: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
1dc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1dd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1df0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1e00: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
1e10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e20: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
1e30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1e50: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1e60: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1e70: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1e80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1e90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ea0: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
1eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1ec0: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
1ed0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1ee0: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
1ef0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1f00: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
1f10: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
1f20: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1f30: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f40: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1f50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1f60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1f70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f80: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1f90: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
1fa0: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
1fb0: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
1fc0: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
1fd0: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
1fe0: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
1ff0: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2000: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2010: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2020: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2030: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
2040: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2050: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
2060: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
2070: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2080: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
2090: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
20a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
20b0: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
20c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
20d0: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
20e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20f0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2100: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2110: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2120: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2130: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
2140: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
2150: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
2160: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
2170: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
2180: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
2190: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
21a0: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
21b0: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
21c0: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
21d0: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
21e0: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
21f0: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2200: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2210: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2220: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2230: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
2240: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2250: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
2260: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
2270: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
2280: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
2290: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
22a0: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
22b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22c0: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
22d0: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
22e0: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
22f0: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2300: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2310: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2320: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2330: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
2340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2350: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2360: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2370: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2380: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2390: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
23a0: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
23b0: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
23c0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
23d0: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
23e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
23f0: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2400: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2410: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2420: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2430: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2440: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
2450: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2460: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2470: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2480: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2490: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
24a0: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
24b0: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
24c0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
24d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24e0: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
24f0: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2500: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2510: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2520: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2530: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
2540: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
2550: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2560: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2570: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2580: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2590: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
25a0: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
25b0: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
25c0: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
25d0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
25e0: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
25f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2600: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2610: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2620: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2630: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2640: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2650: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2660: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2670: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2680: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2690: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
26a0: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
26b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
26c0: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
26d0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
26e0: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
26f0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2700: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2710: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2720: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2730: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2740: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2750: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2760: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2770: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2780: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2790: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
27a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
27b0: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
27c0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
27d0: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
27e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27f0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2800: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2810: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2820: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2830: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2840: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2850: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2860: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2870: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2880: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2890: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
28a0: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
28b0: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
28c0: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
28d0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
28e0: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
28f0: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2900: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2910: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2920: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2930: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2940: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2950: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2960: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2970: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2980: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2990: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
29a0: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
29b0: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
29c0: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
29d0: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
29e0: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
29f0: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2a00: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2a10: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2a20: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2a30: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2a40: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2a50: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2a60: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2a70: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2a80: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2a90: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2aa0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2ab0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2ac0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2ad0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2ae0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2af0: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2b00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2b10: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2b20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2b30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2b50: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2b60: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2b70: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2b80: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2b90: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2ba0: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2bb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bc0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2bd0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2be0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2bf0: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2c00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2c10: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c20: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2c30: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2c40: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2c50: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2c60: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2c70: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2c80: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2c90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2ca0: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2cb0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2cc0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cd0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2ce0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2cf0: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2d00: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2d10: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2d20: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2d30: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2d40: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2d50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d60: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2d70: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2d80: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
2d90: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
2da0: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
2db0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
2dc0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
2dd0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
2de0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2df0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2e00: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
2e10: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
2e20: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
2e30: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
2e40: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
2e50: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
2e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2e70: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
2e80: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2e90: 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a  all mutexing */.
2ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2eb0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
2ec0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  utex = 0;.      
2ed0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ee0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
2ef0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
2f00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
2f10: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2f20: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
2f30: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2f40: 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30  E>0 /* IMP: R-20
2f50: 35 32 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20  520-54086 */.   
2f60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2f70: 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a  FIG_MULTITHREAD:
2f80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61   {.      /* Disa
2f90: 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20  ble mutexing of 
2fa0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2fb0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  ions */.      /*
2fc0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67   Enable mutexing
2fd0: 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74   of core data st
2fe0: 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
2ff0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3000: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3010: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
3020: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3030: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a  bFullMutex = 0;.
3040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3050: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
3060: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
3070: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
3080: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
3090: 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d  /* IMP: R-59593-
30a0: 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63 61 73  21810 */.    cas
30b0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
30c0: 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  SERIALIZED: {.  
30d0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c      /* Enable al
30e0: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
30f0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3100: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3110: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ex = 1;.      sq
3120: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3130: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31  g.bFullMutex = 1
3140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3150: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3170: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3190: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36  0 /* IMP: R-6366
31a0: 36 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63  6-48755 */.    c
31b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
31c0: 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20  G_MUTEX: {.     
31d0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
31e0: 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78  lternative mutex
31f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3200: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3210: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
3220: 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c  ex = *va_arg(ap,
3230: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
3240: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
3250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3260: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3270: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3280: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3290: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
32a0: 3a 20 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20  : R-14450-37597 
32b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
32c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54  TE_CONFIG_GETMUT
32d0: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52  EX: {.      /* R
32e0: 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72  etrieve the curr
32f0: 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ent mutex implem
3300: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3310: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
3320: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
3330: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3340: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
3350: 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
3360: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
3370: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3380: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
3390: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
33a0: 2d 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30  -OF: R-55594-210
33b0: 33 30 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  30 The SQLITE_CO
33c0: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69  NFIG_MALLOC opti
33d0: 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20  on takes a.     
33e0: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
33f0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70  ent which is a p
3400: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
3410: 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20  tance of the.   
3420: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65     ** sqlite3_me
3430: 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74  m_methods struct
3440: 75 72 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ure. The argumen
3450: 74 20 73 70 65 63 69 66 69 65 73 20 61 6c 74 65  t specifies alte
3460: 72 6e 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a  rnative.      **
3470: 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72   low-level memor
3480: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  y allocation rou
3490: 74 69 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64  tines to be used
34a0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
34b0: 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a   memory.      **
34c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
34d0: 69 6e 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20  ines built into 
34e0: 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20  SQLite. */.     
34f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3500: 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67  nfig.m = *va_arg
3510: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
3520: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
3530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3550: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a  ONFIG_GETMALLOC:
3560: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3570: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33  ENCE-OF: R-51213
3580: 2d 34 36 34 31 34 20 54 68 65 20 53 51 4c 49 54  -46414 The SQLIT
3590: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c  E_CONFIG_GETMALL
35a0: 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  OC option takes 
35b0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
35c0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
35d0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
35e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
35f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
3600: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3610: 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20   structure. The 
3620: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3630: 6f 64 73 20 73 74 72 75 63 74 75 72 65 20 69 73  ods structure is
3640: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
3650: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
3660: 74 6c 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f  tly defined memo
3670: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f  ry allocation ro
3680: 75 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20  utines. */.     
3690: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
36a0: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
36b0: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
36c0: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
36d0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
36e0: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
36f0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
3700: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
3710: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3720: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3730: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
3740: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
3750: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3760: 36 31 32 37 35 2d 33 35 31 35 37 20 54 68 65 20  61275-35157 The 
3770: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
3780: 4d 53 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74  MSTATUS option t
3790: 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69  akes.      ** si
37a0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66  ngle argument of
37b0: 20 74 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72   type int, inter
37c0: 70 72 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c  preted as a bool
37d0: 65 61 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c  ean, which enabl
37e0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64  es.      ** or d
37f0: 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c  isables the coll
3800: 65 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79  ection of memory
3810: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74   allocation stat
3820: 69 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20  istics. */.     
3830: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3840: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20  nfig.bMemstat = 
3850: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3860: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3870: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3880: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54  ITE_CONFIG_SCRAT
3890: 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  CH: {.      /* E
38a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
38b0: 34 30 34 2d 36 30 38 38 37 20 54 68 65 72 65 20  404-60887 There 
38c0: 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65  are three argume
38d0: 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
38e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43  SQLITE_CONFIG_SC
38f0: 52 41 54 43 48 3a 20 41 20 70 6f 69 6e 74 65 72  RATCH: A pointer
3900: 20 61 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   an 8-byte align
3910: 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
3920: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77   from.      ** w
3930: 68 69 63 68 20 74 68 65 20 73 63 72 61 74 63 68  hich the scratch
3940: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c   allocations wil
3950: 6c 20 62 65 20 64 72 61 77 6e 2c 20 74 68 65 20  l be drawn, the 
3960: 73 69 7a 65 20 6f 66 20 65 61 63 68 20 73 63 72  size of each scr
3970: 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c  atch.      ** al
3980: 6c 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61  location (sz), a
3990: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  nd the maximum n
39a0: 75 6d 62 65 72 20 6f 66 20 73 63 72 61 74 63 68  umber of scratch
39b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29   allocations (N)
39c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
39d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
39e0: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
39f0: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
3a00: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3a10: 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68  Config.szScratch
3a20: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3a30: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3a40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53  3GlobalConfig.nS
3a50: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
3a60: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3a70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3a80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3a90: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b  FIG_PAGECACHE: {
3aa0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3ab0: 43 45 2d 4f 46 3a 20 52 2d 33 31 34 30 38 2d 34  CE-OF: R-31408-4
3ac0: 30 35 31 30 20 54 68 65 72 65 20 61 72 65 20 74  0510 There are t
3ad0: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3ae0: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3af0: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
3b00: 48 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  HE: A pointer to
3b10: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
3b20: 6d 65 6d 6f 72 79 2c 20 74 68 65 20 73 69 7a 65  memory, the size
3b30: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 65 61 63  .      ** of eac
3b40: 68 20 70 61 67 65 20 62 75 66 66 65 72 20 28 73  h page buffer (s
3b50: 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  z), and the numb
3b60: 65 72 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e  er of pages (N).
3b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
3b90: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3ba0: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3bb0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3bc0: 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61  ig.szPage = va_a
3bd0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3be0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3bf0: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76  Config.nPage = v
3c00: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3c20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3c30: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
3c40: 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20  _HDRSZ: {.      
3c50: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3c60: 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68  R-39100-27317 Th
3c70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3c80: 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74  PCACHE_HDRSZ opt
3c90: 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20  ion takes.      
3ca0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61  ** a single para
3cb0: 6d 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61  meter which is a
3cc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3cd0: 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65  nteger and write
3ce0: 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  s into.      ** 
3cf0: 74 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65  that integer the
3d00: 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   number of extra
3d10: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
3d20: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
3d30: 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  h page.      ** 
3d40: 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  in SQLITE_CONFIG
3d50: 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20  _PAGECACHE. */. 
3d60: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3d70: 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20   int*) = .      
3d80: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
3d90: 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20  rSizeBtree() +. 
3da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3db0: 48 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65  HeaderSizePcache
3dc0: 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73  () +.          s
3dd0: 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65  qlite3HeaderSize
3de0: 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20  Pcache1();.     
3df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3e00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3e10: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
3e20: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3e30: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3e40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3e50: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3e60: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3e70: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3e80: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3e90: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3eb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ec0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
3ed0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3ee0: 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34  CE-OF: R-63325-4
3ef0: 38 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f  8378 The SQLITE_
3f00: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f  CONFIG_PCACHE2 o
3f10: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20  ption takes a.  
3f20: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72      ** single ar
3f30: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
3f40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
3f50: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3f60: 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a  ethods2.      **
3f70: 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62   object. This ob
3f80: 6a 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74  ject specifies t
3f90: 68 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  he interface to 
3fa0: 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61  a custom page ca
3fb0: 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  che.      ** imp
3fc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  lementation. */.
3fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3fe0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
3ff0: 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  2 = *va_arg(ap, 
4000: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
4010: 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20  ethods2*);.     
4020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4040: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a  NFIG_GETPCACHE2:
4050: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4060: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35  ENCE-OF: R-22035
4070: 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54  -46182 The SQLIT
4080: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
4090: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
40a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
40b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
40c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
40d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
40e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
40f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51     ** object. SQ
4100: 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Lite copies of t
4110: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
4120: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
4130: 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20  tion into.      
4140: 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20  ** that object. 
4150: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
4160: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4170: 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d  .pcache2.xInit==
4180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
4190: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
41a0: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
41b0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
41c0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
41d0: 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71  _methods2*) = sq
41e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
41f0: 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20  g.pcache2;.     
4200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f   break;.    }../
4210: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4220: 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65  -06626-12911 The
4230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
4240: 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e  EAP option is on
4250: 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ly.** available 
4260: 69 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  if SQLite is com
4270: 70 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65  piled with eithe
4280: 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  r SQLITE_ENABLE_
4290: 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51  MEMSYS3 or.** SQ
42a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
42b0: 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20  YS5 and returns 
42c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
42d0: 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73  invoked otherwis
42e0: 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e. */.#if define
42f0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4300: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
4310: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
4320: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
4330: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
4340: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
4350: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4360: 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68  R-19854-42126 Th
4370: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72  ere are three ar
4380: 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20  guments to.     
4390: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
43a0: 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74  G_HEAP: An 8-byt
43b0: 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65  e aligned pointe
43c0: 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c  r to the memory,
43d0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75   the.      ** nu
43e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
43f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66   the memory buff
4400: 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69  er, and the mini
4410: 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  mum allocation s
4420: 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ize. */.      sq
4430: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4440: 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.pHeap = va_arg
4450: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
4460: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4470: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
4480: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
44a0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
44b0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
44c0: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  );..      if( sq
44d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
44e0: 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20  g.mnReq<1 ){.   
44f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4500: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4510: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
4520: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4530: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31  lConfig.mnReq>(1
4540: 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20  <<12) ){.       
4550: 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75   /* cap min requ
4560: 65 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32  est size at 2^12
4570: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
4580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4590: 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b  mnReq = (1<<12);
45a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
45b0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
45c0: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30  lConfig.pHeap==0
45d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
45e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
45f0: 39 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65  920-60189 If the
4600: 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28   first pointer (
4610: 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74  the memory point
4620: 65 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  er).        ** i
4630: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c  s NULL, then SQL
4640: 69 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75  ite reverts to u
4650: 73 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74  sing its default
4660: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f   memory allocato
4670: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68  r.        ** (th
4680: 65 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28  e system malloc(
4690: 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
46a0: 29 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70  ), undoing any p
46b0: 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rior invocation 
46c0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51  of.        ** SQ
46d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
46e0: 4f 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  OC..        **. 
46f0: 20 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e         ** Settin
4700: 67 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g sqlite3GlobalC
4710: 6f 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a  onfig.m to all z
4720: 65 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20  eros will cause 
4730: 6d 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20  malloc to.      
4740: 20 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69    ** revert to i
4750: 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65  ts default imple
4760: 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73  mentation when s
4770: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
4780: 65 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20  e() is run.     
4790: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
47a0: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
47b0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
47c0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
47d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
47e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
47f0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
4800: 2d 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39  -OF: R-61006-089
4810: 31 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79  18 If the memory
4820: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
4830: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20  NULL then the.  
4840: 20 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61        ** alterna
4850: 74 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  tive memory allo
4860: 63 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64  cator is engaged
4870: 20 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f   to handle all o
4880: 66 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20  f SQLites.      
4890: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
48a0: 63 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f  cation needs. */
48b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
48c0: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20  NABLE_MEMSYS3.  
48d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
48e0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73  balConfig.m = *s
48f0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
4900: 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ys3();.#endif.#i
4910: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4920: 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20  LE_MEMSYS5.     
4930: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4940: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
4950: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35  te3MemGetMemsys5
4960: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ();.#endif.     
4970: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4980: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4990: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
49a0: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
49b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
49c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
49d0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
49e0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
49f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4a00: 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20  nfig.nLookaside 
4a10: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4a20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4a30: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
4a40: 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  * Record a point
4a50: 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72  er to the logger
4a60: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74   function and it
4a70: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
4a80: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66  ..    ** The def
4a90: 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c  ault is NULL.  L
4aa0: 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c  ogging is disabl
4ab0: 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ed if the functi
4ac0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20  on pointer is.  
4ad0: 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a    ** NULL..    *
4ae0: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
4af0: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a  E_CONFIG_LOG: {.
4b00: 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
4b10: 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
4b20: 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
4b30: 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
4b40: 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
4b50: 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
4b60: 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
4b70: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
4b80: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
4b90: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4ba0: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  (*)(void*,int,co
4bb0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
4bc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
4bd0: 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e  def void(*LOGFUN
4be0: 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  C_t)(void*,int,c
4bf0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
4c00: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4c10: 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61  Config.xLog = va
4c20: 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43  _arg(ap, LOGFUNC
4c30: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
4c40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4c50: 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  LogArg = va_arg(
4c60: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
4c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4c80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c90: 4f 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31  OF: R-55548-3381
4ca0: 37 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69  7 The compile-ti
4cb0: 6d 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55  me setting for U
4cc0: 52 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20  RI filenames.   
4cd0: 20 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67   ** can be chang
4ce0: 65 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65  ed at start-time
4cf0: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a   using the.    *
4d00: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
4d10: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55  (SQLITE_CONFIG_U
4d20: 52 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20  RI,1) or.    ** 
4d30: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
4d40: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
4d50: 2c 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ,0) configuratio
4d60: 6e 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  n calls..    */.
4d70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4d80: 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20  CONFIG_URI: {.  
4d90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4da0: 4f 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32  OF: R-25451-6112
4db0: 35 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  5 The SQLITE_CON
4dc0: 46 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74  FIG_URI option t
4dd0: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20  akes a single.  
4de0: 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20      ** argument 
4df0: 6f 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20  of type int. If 
4e00: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55  non-zero, then U
4e10: 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67  RI handling is g
4e20: 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  lobally.      **
4e30: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65   enabled. If the
4e40: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65   parameter is ze
4e50: 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e  ro, then URI han
4e60: 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c  dling is globall
4e70: 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62  y.      ** disab
4e80: 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  led. */.      sq
4e90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4ea0: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
4eb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ed0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
4ee0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
4ef0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
4f00: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
4f10: 45 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32  E-OF: R-36592-02
4f20: 37 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43  772 The SQLITE_C
4f30: 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49  ONFIG_COVERING_I
4f40: 4e 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20  NDEX_SCAN.      
4f50: 2a 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  ** option takes 
4f60: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
4f70: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
4f80: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
4f90: 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f  s a.      ** boo
4fa0: 6c 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  lean in order to
4fb0: 20 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   enable or disab
4fc0: 6c 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f  le the use of co
4fd0: 76 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66  vering indices f
4fe0: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  or.      ** full
4ff0: 20 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20   table scans in 
5000: 74 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  the query optimi
5010: 7a 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  zer. */.      sq
5020: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5030: 67 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61  g.bUseCis = va_a
5040: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5060: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5070: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20  NABLE_SQLLOG.   
5080: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5090: 46 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20  FIG_SQLLOG: {.  
50a0: 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
50b0: 28 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28  (*SQLLOGFUNC_t)(
50c0: 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  void*, sqlite3*,
50d0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
50e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
5100: 71 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  qllog = va_arg(a
5110: 70 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29  p, SQLLOGFUNC_t)
5120: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5130: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
5140: 6c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  logArg = va_arg(
5150: 61 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20  ap, void *);.   
5160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5170: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
5180: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5190: 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
51a0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
51b0: 3a 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20  : R-58063-38258 
51c0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
51d0: 41 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77  AP_SIZE takes tw
51e0: 6f 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  o 64-bit.      *
51f0: 2a 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74  * integer (sqlit
5200: 65 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73  e3_int64) values
5210: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65   that are the de
5220: 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20  fault mmap size 
5230: 6c 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28  limit.      ** (
5240: 74 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  the default sett
5250: 69 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d  ing for PRAGMA m
5260: 6d 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68  map_size) and th
5270: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5280: 64 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20  d.      ** mmap 
5290: 73 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20  size limit. */. 
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
52b0: 36 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61  64 szMmap = va_a
52c0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
52d0: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt64);.      sql
52e0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61  ite3_int64 mxMma
52f0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
5300: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
5310: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5320: 2d 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31  -OF: R-53367-431
5330: 39 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67  90 If either arg
5340: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70  ument to this op
5350: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  tion is.      **
5360: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
5370: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73  that argument is
5380: 20 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20   changed to its 
5390: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66  compile-time def
53a0: 61 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ault..      **. 
53b0: 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
53c0: 2d 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30  -OF: R-34993-450
53d0: 33 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61  31 The maximum a
53e0: 6c 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65  llowed mmap size
53f0: 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a   will be.      *
5400: 2a 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63  * silently trunc
5410: 61 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  ated if necessar
5420: 79 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  y so that it doe
5430: 73 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65  s not exceed the
5440: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
5450: 65 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d  e-time maximum m
5460: 6d 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20  map size set by 
5470: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  the SQLITE_MAX_M
5480: 4d 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a  MAP_SIZE.      *
5490: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
54a0: 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
54b0: 20 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70        if( mxMmap
54c0: 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c  <0 || mxMmap>SQL
54d0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
54e0: 45 20 29 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c  E ) mxMmap = SQL
54f0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
5500: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  E;.      if( szM
5510: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
5520: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
5530: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5540: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
5550: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
5560: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
5570: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5580: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
55a0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
55b0: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
55c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
55d0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
55e0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
55f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5600: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5610: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5620: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5630: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5640: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5650: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5660: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5670: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5680: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5690: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
56a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
56b0: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
56c0: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
56d0: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
56e0: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
56f0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5700: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5710: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5720: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5730: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5740: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5750: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5760: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5770: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5780: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5790: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
57a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
57b0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
57c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
57d0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
57e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
57f0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
5800: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5810: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20  *.** Set up the 
5820: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
5830: 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  s for a database
5840: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20   connection..** 
5850: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
5860: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a   on success.  .*
5870: 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69  * If lookaside i
5880: 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
5890: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
58a0: 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BUSY..**.** The 
58b0: 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  sz parameter is 
58c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
58d0: 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b  tes in each look
58e0: 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54  aside slot..** T
58f0: 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72  he cnt parameter
5900: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5910: 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74  f slots.  If pSt
5920: 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a  art is NULL the.
5930: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
5940: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
5950: 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
5960: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
5970: 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72  c()..** If pStar
5980: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
5990: 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20  en it is sz*cnt 
59a0: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
59b0: 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68  to use for.** th
59c0: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
59d0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
59e0: 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  t setupLookaside
59f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
5a00: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a  id *pBuf, int sz
5a10: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f  , int cnt){.  vo
5a20: 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66  id *pStart;.  if
5a30: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
5a40: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nOut ){.    retu
5a50: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5a60: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
5a70: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
5a80: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
5a90: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
5aa0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
5ab0: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
5ac0: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
5ad0: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
5ae0: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
5af0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
5b00: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
5b10: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
5b20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
5b30: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
5b40: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
5b50: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
5b60: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
5b70: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
5b80: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
5b90: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
5ba0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
5bb0: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
5bc0: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
5bd0: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
5be0: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
5bf0: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
5c00: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
5c10: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
5c20: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
5c30: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
5c40: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
5c50: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
5c60: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
5c70: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
5c80: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
5c90: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
5ca0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
5cb0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
5cc0: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
5cd0: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
5ce0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
5cf0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
5d00: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
5d10: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
5d20: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
5d30: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
5d40: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
5d50: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
5d60: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
5d70: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
5d80: 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20  ide.pFree = 0;. 
5d90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
5da0: 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69  z = (u16)sz;.  i
5db0: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
5dc0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b   int i;.    Look
5dd0: 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20  asideSlot *p;.  
5de0: 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28    assert( sz > (
5df0: 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61  int)sizeof(Looka
5e00: 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20  sideSlot*) );.  
5e10: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
5e20: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
5e30: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
5e40: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
5e50: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
5e60: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b  lookaside.pFree;
5e70: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
5e80: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a  side.pFree = p;.
5e90: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
5ea0: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
5eb0: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
5ec0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
5ed0: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
5ee0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
5ef0: 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64  abled = 1;.    d
5f00: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
5f10: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
5f20: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
5f30: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
5f40: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
5f50: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
5f60: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
5f70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
5f80: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  nabled = 0;.    
5f90: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
5fa0: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d  alloced = 0;.  }
5fb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5fc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
5fd0: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
5fe0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
5ff0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6000: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
6010: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
6020: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
6030: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
6040: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
6050: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6060: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6070: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
6080: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
6090: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
60a0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
60b0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
60c0: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ex;.}../*.** Fre
60d0: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
60e0: 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72  ory as we can fr
60f0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  om the given dat
6100: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
6110: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
6120: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
6130: 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64  emory(sqlite3 *d
6140: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  b){.  int i;..#i
6150: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6160: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6170: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6180: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
6190: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
61a0: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
61b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
61c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
61d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
61e0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
61f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
6200: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
6210: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
6220: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
6230: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
6240: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6250: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6260: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
6270: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
6280: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
6290: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
62a0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
62b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
62c0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
62d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
62e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
62f0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
6300: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
6310: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
6320: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
6330: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
6340: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
6350: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
6360: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6370: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
6380: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
6390: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
63a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
63b0: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
63c0: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
63d0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
63e0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
63f0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
6400: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
6410: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6420: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
6430: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
6440: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
6450: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6460: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
6470: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
6480: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
6490: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
64a0: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
64b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
64c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
64d0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
64e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
64f0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
6500: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
6510: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
6520: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
6530: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
6540: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
6550: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
6560: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
6570: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6580: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6590: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
65a0: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
65b0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
65c0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
65d0: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
65e0: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
65f0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
6600: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
6610: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
6620: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
6630: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
6640: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
6650: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
6660: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
6670: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
6680: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
6690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
66a0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
66b0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
66c0: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
66d0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
66e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
66f0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
6700: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
6710: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
6720: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
6730: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
6740: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
6750: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
6760: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
6770: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6780: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
6790: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
67a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
67b0: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
67c0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
67d0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
67e0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
67f0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
6800: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
6810: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
6820: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
6830: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
6840: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
6850: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6860: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6870: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
6880: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
68a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
68b0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
68c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
68d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
68e0: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
68f0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
6900: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
6910: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
6920: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
6930: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
6940: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
6950: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
6960: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
6970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
6980: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
6990: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
69a0: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
69b0: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
69c0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
69d0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
69e0: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
69f0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
6a00: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
6a10: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
6a20: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
6a30: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
6a40: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
6a50: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
6a60: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
6a70: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
6a80: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
6a90: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
6aa0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
6ab0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
6ac0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
6ad0: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
6ae0: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
6af0: 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  y2;.  /* EVIDENC
6b00: 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38  E-OF: R-65033-28
6b10: 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e  449 The built-in
6b20: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
6b30: 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20  n compares.  ** 
6b40: 73 74 72 69 6e 67 73 20 62 79 74 65 20 62 79 20  strings byte by 
6b50: 62 79 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d  byte using the m
6b60: 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e  emcmp() function
6b70: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
6b80: 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72  rd C.  ** librar
6b90: 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d  y. */.  rc = mem
6ba0: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
6bb0: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
6bc0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
6bd0: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
6be0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
6bf0: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
6c00: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
6c10: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
6c20: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
6c30: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45     ){.      /* E
6c40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
6c50: 36 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20  624-24737 RTRIM 
6c60: 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65  is like BINARY e
6c70: 78 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61  xcept that extra
6c80: 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73  .      ** spaces
6c90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
6ca0: 69 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20  ither string do 
6cb0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72  not change the r
6cc0: 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a  esult. In other.
6cd0: 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20        ** words, 
6ce0: 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d  strings will com
6cf0: 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e  pare equal to on
6d00: 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  e another as lon
6d10: 67 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20  g as they.      
6d20: 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69  ** differ only i
6d30: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6d40: 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e  spaces at the en
6d50: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
6d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
6d70: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
6d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6d90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6da0: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
6db0: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
6dc0: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
6dd0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
6de0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
6df0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
6e00: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
6e10: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
6e20: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
6e30: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
6e40: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
6e50: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
6e60: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
6e70: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
6e80: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
6e90: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
6ea0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
6eb0: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
6ec0: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
6ed0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
6ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
6ef0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
6f00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
6f10: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
6f20: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
6f30: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
6f40: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
6f50: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
6f60: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
6f70: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
6f80: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
6f90: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
6fa0: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
6fb0: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
6fc0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
6fd0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
6fe0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
6ff0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
7000: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
7010: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
7020: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
7030: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
7040: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
7050: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7060: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7070: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7080: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7090: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
70a0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
70b0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
70c0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
70d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
70e0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
70f0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
7100: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
7110: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7120: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
7130: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7140: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7150: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
7160: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
7170: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7180: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7190: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
71a0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
71b0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
71c0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
71d0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
71e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
71f0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7200: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
7210: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7220: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
7230: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
7240: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
7250: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
7260: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
7270: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
7280: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
7290: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
72a0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
72b0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
72c0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
72d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
72e0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
72f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
7300: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
7310: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
7320: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
7330: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
7340: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
7350: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
7360: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
7370: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
7380: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
7390: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
73a0: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
73b0: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
73c0: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
73d0: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
73e0: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
73f0: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
7400: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
7410: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
7420: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
7430: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
7440: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
7450: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
7460: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
7470: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
7480: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
7490: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
74a0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
74b0: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
74c0: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
74d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
74e0: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
74f0: 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  r function assoc
7500: 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44  iated with FuncD
7510: 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78  ef p, if any. Ex
7520: 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73  cept,.** if this
7530: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
7540: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e   copy of the fun
7550: 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e  ction, do not in
7560: 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c  voke it. Multipl
7570: 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61  e.** copies of a
7580: 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e   single function
7590: 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65   are created whe
75a0: 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  n create_functio
75b0: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  n() is called.**
75c0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59   with SQLITE_ANY
75d0: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
75e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
75f0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
7600: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
7610: 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e  ncDef *p){.  Fun
7620: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
7630: 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44  structor = p->pD
7640: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28  estructor;.  if(
7650: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
7660: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
7670: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7680: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
7690: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ef==0 ){.      p
76a0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73  Destructor->xDes
76b0: 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72  troy(pDestructor
76c0: 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20  ->pUserData);.  
76d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
76e0: 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f  e(db, pDestructo
76f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
7700: 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63  ./*.** Disconnec
7710: 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74  t all sqlite3_vt
7720: 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ab objects that 
7730: 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61  belong to databa
7740: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
7750: 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c   db. This is cal
7760: 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62  led when db is b
7770: 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  eing closed..*/.
7780: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63  static void disc
7790: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71  onnectAllVtab(sq
77a0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e  lite3 *db){.#ifn
77b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
77d0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt i;.  sqlite3B
77e0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
77f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
7800: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
7810: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
7820: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  a = db->aDb[i].p
7830: 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20  Schema;.    if( 
7840: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
7850: 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68  ma ){.      Hash
7860: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66  Elem *p;.      f
7870: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
7880: 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  irst(&pSchema->t
7890: 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71  blHash); p; p=sq
78a0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
78b0: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
78c0: 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a  *pTab = (Table *
78d0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
78e0: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
78f0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
7900: 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73  ) sqlite3VtabDis
7910: 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62  connect(db, pTab
7920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7930: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
7940: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
7950: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
7960: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65  LeaveAll(db);.#e
7970: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
7980: 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64  AMETER(db);.#end
7990: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
79a0: 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62  rn TRUE if datab
79b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
79c0: 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65  b has unfinalize
79d0: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
79e0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
79f0: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
7a00: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20  ackup objects.  
7a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
7a20: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
7a30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
7a40: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
7a50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7a60: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
7a70: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
7a80: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
7a90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
7aa0: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; j++){.    Bt
7ab0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
7ac0: 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[j].pBt;.    i
7ad0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
7ae0: 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70  3BtreeIsInBackup
7af0: 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31  (pBt) ) return 1
7b00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7b20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c   an existing SQL
7b30: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  ite database.*/.
7b40: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
7b50: 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  e3Close(sqlite3 
7b60: 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f  *db, int forceZo
7b70: 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62  mbie){.  if( !db
7b80: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
7b90: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d  NCE-OF: R-63257-
7ba0: 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71  11740 Calling sq
7bb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72  lite3_close() or
7bc0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
7bd0: 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20  close_v2() with 
7be0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
7bf0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72  rgument is a har
7c00: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a  mless no-op. */.
7c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7c20: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
7c30: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7c40: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
7c50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7c60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
7c70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
7c80: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7c90: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f  mutex);..  /* Fo
7ca0: 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  rce xDisconnect 
7cb0: 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72  calls on all vir
7cc0: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tual tables */. 
7cd0: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
7ce0: 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ab(db);..  /* If
7cf0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7d00: 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63  s open, the disc
7d10: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20  onnectAllVtab() 
7d20: 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20  call above.  ** 
7d30: 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61  will not have ca
7d40: 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e  lled the xDiscon
7d50: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e  nect() method on
7d60: 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a   any virtual.  *
7d70: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
7d80: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
7d90: 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ray. The followi
7da0: 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  ng sqlite3VtabRo
7db0: 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61  llback().  ** ca
7dc0: 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57  ll will do so. W
7dd0: 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
7de0: 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65  s before the che
7df0: 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20  ck for active.  
7e00: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
7e10: 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20  s below, as the 
7e20: 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  v-table implemen
7e30: 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74  tation may be st
7e40: 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20  oring.  ** some 
7e50: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
7e60: 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  nts internally..
7e70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74    */.  sqlite3Vt
7e80: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
7e90: 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68  .  /* Legacy beh
7ea0: 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63  avior (sqlite3_c
7eb0: 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29  lose() behavior)
7ec0: 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20   is to return.  
7ed0: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
7ee0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
7ef0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73   can not be clos
7f00: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
7f10: 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63    */.  if( !forc
7f20: 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65  eZombie && conne
7f30: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
7f40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
7f50: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
7f60: 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61  QLITE_BUSY, "una
7f70: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
7f80: 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20   to unfinalized 
7f90: 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d  ".       "statem
7fa0: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
7fb0: 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20  ed backups");.  
7fc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7fd0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7fe0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
7ff0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23  ITE_BUSY;.  }..#
8000: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8010: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28  BLE_SQLLOG.  if(
8020: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
8030: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a  nfig.xSqllog ){.
8040: 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74      /* Closing t
8050: 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  he handle. Fourt
8060: 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
8070: 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20  assed the value 
8080: 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  2. */.    sqlite
8090: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
80a0: 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f  qllog(sqlite3Glo
80b0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
80c0: 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b  gArg, db, 0, 2);
80d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
80e0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f  * Convert the co
80f0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20  nnection into a 
8100: 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20  zombie and then 
8110: 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  close it..  */. 
8120: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
8130: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
8140: 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65  ;.  sqlite3Leave
8150: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8160: 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  bie(db);.  retur
8170: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8180: 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74  /*.** Two variat
8190: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c  ions on the publ
81a0: 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72  ic interface for
81b0: 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62   closing a datab
81c0: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
81d0: 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  n. The sqlite3_c
81e0: 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72  lose() version r
81f0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
8200: 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73  SY and.** leaves
8210: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8220: 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  option if there 
8230: 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  are unfinalized 
8240: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
8250: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
8260: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
8270: 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74  kups.  The sqlit
8280: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a  e3_close_v2().**
8290: 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20   version forces 
82a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
82b0: 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69  o become a zombi
82c0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  e if there are.*
82d0: 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75  * unclosed resou
82e0: 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67  rces, and arrang
82f0: 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74  es for deallocat
8300: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ion when the las
8310: 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61  t.** prepare sta
8320: 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65  tement or sqlite
8330: 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e  3_backup closes.
8340: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8350: 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  close(sqlite3 *d
8360: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
8370: 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d  e3Close(db,0); }
8380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
8390: 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64  se_v2(sqlite3 *d
83a0: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
83b0: 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d  e3Close(db,1); }
83c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  .../*.** Close t
83d0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
83e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
83f0: 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65  db..**.** Furthe
8400: 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61  rmore, if databa
8410: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
8420: 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65   is a zombie (me
8430: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65  aning that there
8440: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70  .** has been a p
8450: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
8460: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f  ite3_close(db) o
8470: 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  r sqlite3_close_
8480: 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65  v2(db)) and.** e
8490: 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d  very sqlite3_stm
84a0: 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66  t has now been f
84b0: 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65  inalized and eve
84c0: 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ry sqlite3_backu
84d0: 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65  p has.** finishe
84e0: 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c  d, then free all
84f0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76   resources..*/.v
8500: 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65  oid sqlite3Leave
8510: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8520: 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  bie(sqlite3 *db)
8530: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
8560: 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e iterator */.  
8570: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20  int j;..  /* If 
8580: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
8590: 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74  nding sqlite3_st
85a0: 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  mt or sqlite3_ba
85b0: 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a  ckup objects.  *
85c0: 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e  * or if the conn
85d0: 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  ection has not y
85e0: 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62  et been closed b
85f0: 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  y sqlite3_close_
8600: 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  v2(),.  ** then 
8610: 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d  just leave the m
8620: 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e  utex and return.
8630: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
8640: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
8650: 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f  GIC_ZOMBIE || co
8660: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
8670: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
8680: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
8690: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
86a0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
86b0: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
86c0: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
86d0: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
86e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
86f0: 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c  s.  ** closed al
8700: 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61  l sqlite3_stmt a
8710: 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  nd sqlite3_backu
8720: 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61  p objects and ha
8730: 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73  s been.  ** pass
8740: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ed to sqlite3_cl
8750: 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ose (meaning tha
8760: 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65  t it is a zombie
8770: 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20  ).  Therefore,. 
8780: 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64   ** go ahead and
8790: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
87a0: 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ces..  */..  /* 
87b0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
87c0: 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69   is open, roll i
87d0: 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73  t back. This als
87e0: 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69  o ensures that i
87f0: 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62  f.  ** any datab
8800: 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65  ase schemas have
8810: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62   been modified b
8820: 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64  y an uncommitted
8830: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
8840: 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74  * they are reset
8850: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72  . And that the r
8860: 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d  equired b-tree m
8870: 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20  utex is held to 
8880: 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  make.  ** the pa
8890: 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ger rollback and
88a0: 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e   schema reset an
88b0: 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f   atomic operatio
88c0: 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52  n. */.  sqlite3R
88d0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
88e0: 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a  QLITE_OK);..  /*
88f0: 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61   Free any outsta
8900: 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20  nding Savepoint 
8910: 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20  structures. */. 
8920: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
8930: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20  epoints(db);..  
8940: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74  /* Close all dat
8950: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8960: 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  s */.  for(j=0; 
8970: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
8980: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
8990: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a  pDb = &db->aDb[j
89a0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
89b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
89c0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
89d0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
89e0: 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20  pDb->pBt = 0;.  
89f0: 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a      if( j!=1 ){.
8a00: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63          pDb->pSc
8a10: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
8a20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
8a30: 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20   Clear the TEMP 
8a40: 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c  schema separatel
8a50: 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20  y and last */.  
8a60: 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
8a70: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71  Schema ){.    sq
8a80: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
8a90: 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  (db->aDb[1].pSch
8aa0: 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ema);.  }.  sqli
8ab0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
8ac0: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  t(db);..  /* Fre
8ad0: 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f  e up the array o
8ae0: 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  f auxiliary data
8af0: 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  bases */.  sqlit
8b00: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
8b10: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61  seArray(db);.  a
8b20: 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d  ssert( db->nDb<=
8b30: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  2 );.  assert( d
8b40: 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53  b->aDb==db->aDbS
8b50: 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54  tatic );..  /* T
8b60: 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ell the code in 
8b70: 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68  notify.c that th
8b80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20  e connection no 
8b90: 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79  longer holds any
8ba0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20  .  ** locks and 
8bb0: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
8bc0: 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c   any further unl
8bd0: 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
8be0: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  acks..  */.  sql
8bf0: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  ite3ConnectionCl
8c00: 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72  osed(db);..  for
8c10: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
8c20: 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20  e(db->aFunc.a); 
8c30: 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  j++){.    FuncDe
8c40: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68  f *pNext, *pHash
8c50: 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  , *p;.    for(p=
8c60: 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20  db->aFunc.a[j]; 
8c70: 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20  p; p=pHash){.   
8c80: 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48     pHash = p->pH
8c90: 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ash;.      while
8ca0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( p ){.        f
8cb0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
8cc0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
8cd0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
8ce0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8cf0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
8d00: 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74         p = pNext
8d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8d20: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
8d30: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
8d40: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
8d50: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8d60: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
8d70: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
8d80: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
8d90: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
8da0: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
8db0: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
8dc0: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
8dd0: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
8de0: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
8df0: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
8e00: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
8e10: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
8e20: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
8e30: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
8e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8e60: 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, pColl);.  }.
8e70: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
8e80: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
8e90: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8ea0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8eb0: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
8ec0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
8ed0: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
8ee0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
8ef0: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
8f00: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
8f10: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
8f20: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
8f30: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
8f40: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
8f50: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
8f60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8f70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64  3DbFree(db, pMod
8f80: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8f90: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
8fa0: 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
8fb0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
8fc0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20  db, SQLITE_OK); 
8fd0: 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61  /* Deallocates a
8fe0: 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20  ny cached error 
8ff0: 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71  strings. */.  sq
9000: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64  lite3ValueFree(d
9010: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69  b->pErr);.  sqli
9020: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
9030: 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49  ns(db);.#if SQLI
9040: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
9050: 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  CATION.  sqlite3
9060: 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a  _free(db->auth.z
9070: 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c  AuthUser);.  sql
9080: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
9090: 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e  th.zAuthPW);.#en
90a0: 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  dif..  db->magic
90b0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
90c0: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
90d0: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
90e0: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
90f0: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
9100: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
9110: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
9120: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
9130: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
9140: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
9150: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
9160: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
9170: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
9180: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
9190: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
91a0: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
91b0: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
91c0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
91d0: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
91e0: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
91f0: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
9200: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
9210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
9220: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
9230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9240: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9250: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
9260: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
9270: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
9280: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
9290: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
92a0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
92b0: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
92c0: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
92d0: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
92e0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
92f0: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
9300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9310: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
9320: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
9330: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
9340: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  b);.}../*.** Rol
9350: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
9360: 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72  se files.  If tr
9370: 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
9380: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a  LITE_OK, then.**
9390: 20 61 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f   any write curso
93a0: 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
93b0: 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20  ed ("tripped" - 
93c0: 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20  as in "tripping 
93d0: 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65  a circuit.** bre
93e0: 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20  aker") and made 
93f0: 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f  to return tripCo
9400: 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  de if there are 
9410: 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61  any further.** a
9420: 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74  ttempts to use t
9430: 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61  hat cursor.  Rea
9440: 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e  d cursors remain
9450: 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a   open and valid.
9460: 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61 76 65  ** but are "save
9470: 64 22 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  d" in case the t
9480: 61 62 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d  able pages are m
9490: 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a  oved around..*/.
94a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
94b0: 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20  backAll(sqlite3 
94c0: 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64  *db, int tripCod
94d0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
94e0: 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  nt inTrans = 0;.
94f0: 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e    int schemaChan
9500: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
9510: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9520: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
9530: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
9540: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
9550: 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d  /* Obtain all b-
9560: 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66  tree mutexes bef
9570: 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63  ore making any c
9580: 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c  alls to BtreeRol
9590: 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54  lback(). .  ** T
95a0: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
95b0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
95c0: 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72  nsaction being r
95d0: 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20  olled back has. 
95e0: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65   ** modified the
95f0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
9600: 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  . If the b-tree 
9610: 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20  mutexes are not 
9620: 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c  taken.  ** here,
9630: 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68   then another sh
9640: 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65  ared-cache conne
9650: 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61  ction might snea
9660: 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a  k in between.  *
9670: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  * the database r
9680: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
9690: 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20  ma reset, which 
96a0: 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a  can cause false.
96b0: 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
96c0: 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20  reports in some 
96d0: 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c  cases.  */.  sql
96e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
96f0: 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43  l(db);.  schemaC
9700: 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61  hange = (db->fla
9710: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
9720: 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26  rnChanges)!=0 &&
9730: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
9740: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
9750: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9760: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
9770: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9780: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
9790: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
97a0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
97b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e  {.        inTran
97c0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
97d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
97e0: 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69  eRollback(p, tri
97f0: 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68  pCode, !schemaCh
9800: 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ange);.    }.  }
9810: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
9820: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
9830: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
9840: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28  lloc();..  if( (
9850: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
9860: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21  _InternChanges)!
9870: 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 && db->init.b
9880: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  usy==0 ){.    sq
9890: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
98a0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
98b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
98c0: 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
98d0: 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20  onnection(db);. 
98e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
98f0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
9900: 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65    /* Any deferre
9910: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  d constraint vio
9920: 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77  lations have now
9930: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
9940: 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  */.  db->nDeferr
9950: 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  edCons = 0;.  db
9960: 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
9970: 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ns = 0;.  db->fl
9980: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
9990: 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49  eferFKs;..  /* I
99a0: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
99b0: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
99c0: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
99d0: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
99e0: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
99f0: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
9a00: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
9a10: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
9a20: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
9a30: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
9a40: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
9a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9a60: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
9a70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
9a80: 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
9a90: 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63  g to the error c
9aa0: 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ode.** specified
9ab0: 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
9ac0: 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65  ..*/.#if (define
9ad0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
9ae0: 26 26 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  && SQLITE_OS_WIN
9af0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
9b00: 49 54 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20  ITE_TEST).const 
9b10: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
9b20: 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20  Name(int rc){.  
9b30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9b40: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
9b50: 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66  origRc = rc;.  f
9b60: 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a  or(i=0; i<2 && z
9b70: 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63  Name==0; i++, rc
9b80: 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73   &= 0xff){.    s
9b90: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
9ba0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
9bb0: 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K:              
9bc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9bd0: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
9be0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9bf0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9c00: 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20  ERROR:          
9c10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9c20: 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20  ITE_ERROR";     
9c30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9c40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9c50: 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20  _INTERNAL:      
9c60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9c70: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20  LITE_INTERNAL"; 
9c80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9c90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9ca0: 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20  E_PERM:         
9cb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9cc0: 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20  QLITE_PERM";    
9cd0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9ce0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9cf0: 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20  TE_ABORT:       
9d00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9d10: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20  SQLITE_ABORT";  
9d20: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9d30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9d40: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
9d50: 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  CK:     zName = 
9d60: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  "SQLITE_ABORT_RO
9d70: 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61  LLBACK";    brea
9d80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d90: 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20  LITE_BUSY:      
9da0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9db0: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20   "SQLITE_BUSY"; 
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9dd0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9de0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
9df0: 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  ERY:      zName 
9e00: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  = "SQLITE_BUSY_R
9e10: 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72  ECOVERY";     br
9e20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9e30: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
9e40: 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SHOT:      zName
9e50: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
9e60: 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62  SNAPSHOT";     b
9e70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9e80: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20   SQLITE_LOCKED: 
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9ea0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b  e = "SQLITE_LOCK
9eb0: 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ED";            
9ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9ed0: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  e SQLITE_LOCKED_
9ee0: 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61  SHAREDCACHE: zNa
9ef0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
9f00: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 22  KED_SHAREDCACHE"
9f10: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
9f20: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9f40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
9f50: 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  MEM";           
9f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9f70: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
9f80: 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NLY:           z
9f90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
9fa0: 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20  EADONLY";       
9fb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9fc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
9fd0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  ONLY_RECOVERY:  
9fe0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9ff0: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
a000: 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Y"; break;.     
a010: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
a020: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20  DONLY_CANTLOCK: 
a030: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a040: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
a050: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
a060: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
a070: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a  ADONLY_ROLLBACK:
a080: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a090: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
a0a0: 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACK"; break;.   
a0b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a0c0: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a  EADONLY_DBMOVED:
a0d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a0e0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
a0f0: 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  VED";  break;.  
a100: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a110: 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20 20  INTERRUPT:      
a120: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a130: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20  ITE_INTERRUPT"; 
a140: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a150: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a160: 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20  _IOERR:         
a170: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a180: 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20  LITE_IOERR";    
a190: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a1a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a1b0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20  E_IOERR_READ:   
a1c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a1d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
a1e0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
a1f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a200: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
a210: 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  EAD:   zName = "
a220: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
a230: 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b  RT_READ";  break
a240: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a250: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a  ITE_IOERR_WRITE:
a260: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a270: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  "SQLITE_IOERR_WR
a280: 49 54 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  ITE";       brea
a290: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a2a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
a2b0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
a2c0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46   "SQLITE_IOERR_F
a2d0: 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65  SYNC";       bre
a2e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a2f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
a300: 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20  FSYNC:    zName 
a310: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a320: 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72  DIR_FSYNC";   br
a330: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a340: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
a350: 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65  NCATE:     zName
a360: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a370: 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62  _TRUNCATE";    b
a380: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a390: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
a3a0: 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  TAT:        zNam
a3b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a3c0: 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20 20  R_FSTAT";       
a3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a3e0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  e SQLITE_IOERR_U
a3f0: 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61  NLOCK:       zNa
a400: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a410: 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20  RR_UNLOCK";     
a420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a430: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a440: 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e  RDLOCK:       zN
a450: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a460: 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20  ERR_RDLOCK";    
a470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a480: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a490: 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a  _DELETE:       z
a4a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a4b0: 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20  OERR_DELETE";   
a4c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a4d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a4e0: 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  R_NOMEM:        
a4f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a500: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20  IOERR_NOMEM";   
a510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a520: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a530: 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20  RR_ACCESS:      
a540: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a550: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20  _IOERR_ACCESS"; 
a560: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a570: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a580: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
a590: 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  DLOCK:.         
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a5c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
a5d0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b  CKRESERVEDLOCK";
a5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a5f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a600: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  LOCK:         zN
a610: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a620: 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20  ERR_LOCK";      
a630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a640: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a650: 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a  _CLOSE:        z
a660: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a670: 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20  OERR_CLOSE";    
a680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a690: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a6a0: 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20  R_DIR_CLOSE:    
a6b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a6c0: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22  IOERR_DIR_CLOSE"
a6d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
a6e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a6f0: 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20  RR_SHMOPEN:     
a700: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a710: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b  _IOERR_SHMOPEN";
a720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a730: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a740: 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20  ERR_SHMSIZE:    
a750: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a760: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22  E_IOERR_SHMSIZE"
a770: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a780: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a790: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20  OERR_SHMLOCK:   
a7a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a7b0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
a7c0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a7d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a7e0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20  IOERR_SHMMAP:   
a7f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a800: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
a810: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a820: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a830: 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20  _IOERR_SEEK:    
a840: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a850: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22  LITE_IOERR_SEEK"
a860: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
a870: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a880: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
a890: 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  OENT: zName = "S
a8a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
a8b0: 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b  TE_NOENT";break;
a8c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a8d0: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20  TE_IOERR_MMAP:  
a8e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a8f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
a900: 50 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  P";        break
a910: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a920: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
a930: 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  PPATH:  zName = 
a940: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  "SQLITE_IOERR_GE
a950: 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61  TTEMPPATH"; brea
a960: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a970: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
a980: 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATH:     zName =
a990: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
a9a0: 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62 72 65  ONVPATH";    bre
a9b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a9c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20  QLITE_CORRUPT:  
a9d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a9e0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  = "SQLITE_CORRUP
a9f0: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  T";           br
aa00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aa10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
aa20: 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  TAB:       zName
aa30: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55   = "SQLITE_CORRU
aa40: 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62  PT_VTAB";      b
aa50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa60: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
aa70: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
aa80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46  e = "SQLITE_NOTF
aa90: 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20  OUND";          
aaa0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aab0: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
aad0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c  me = "SQLITE_FUL
aae0: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  L";             
aaf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ab00: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
ab10: 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  EN:           zN
ab20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
ab30: 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20  NTOPEN";        
ab40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ab50: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
ab60: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a  PEN_NOTEMPDIR: z
ab70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
ab80: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
ab90: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
aba0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
abb0: 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20  OPEN_ISDIR:     
abc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
abd0: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b  CANTOPEN_ISDIR";
abe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
abf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
ac00: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20  TOPEN_FULLPATH: 
ac10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac20: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
ac30: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
ac40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
ac50: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a  NTOPEN_CONVPATH:
ac60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac70: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
ac80: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
ac90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
aca0: 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20  ROTOCOL:        
acb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
acc0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20  TE_PROTOCOL";   
acd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ace0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
acf0: 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20 20 20  EMPTY:          
ad00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ad10: 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20  ITE_EMPTY";     
ad20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ad30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ad40: 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20  _SCHEMA:        
ad50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ad60: 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20  LITE_SCHEMA";   
ad70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ad80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad90: 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20  E_TOOBIG:       
ada0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
adb0: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20  QLITE_TOOBIG";  
adc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
add0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ade0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20  TE_CONSTRAINT:  
adf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ae00: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ae10: 54 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  T";        break
ae20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ae30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
ae40: 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20  NIQUE:  zName = 
ae50: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
ae60: 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61  NT_UNIQUE"; brea
ae70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae80: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
ae90: 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d  TRIGGER: zName =
aea0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
aeb0: 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65  INT_TRIGGER";bre
aec0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aed0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
aee0: 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20  _FOREIGNKEY:.   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
af10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
af20: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
af30: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
af40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af50: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
af60: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
af70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
af80: 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HECK";  break;. 
af90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
afa0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
afb0: 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  ARYKEY:.        
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
afe0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
aff0: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20  NT_PRIMARYKEY"; 
b000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b010: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b020: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  RAINT_NOTNULL: z
b030: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b040: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
b050: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
b060: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b070: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
b080: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b0b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
b0c0: 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65  MMITHOOK";   bre
b0d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b0e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b0f0: 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20  _VTAB:    zName 
b100: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b110: 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72  AINT_VTAB";   br
b120: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b130: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b140: 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  T_FUNCTION:.    
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b170: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b180: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22  TRAINT_FUNCTION"
b190: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b1a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b1b0: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a  ONSTRAINT_ROWID:
b1c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b1d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
b1e0: 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  WID";  break;.  
b1f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b200: 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20  MISMATCH:       
b210: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b220: 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20  ITE_MISMATCH";  
b230: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b240: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b250: 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20 20  _MISUSE:        
b260: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b270: 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20  LITE_MISUSE";   
b280: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b290: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b2a0: 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20  E_NOLFS:        
b2b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b2c0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20  QLITE_NOLFS";   
b2d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b2e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2f0: 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20  TE_AUTH:        
b300: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b310: 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20  SQLITE_AUTH";   
b320: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b330: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b340: 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20  ITE_FORMAT:     
b350: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b360: 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b  "SQLITE_FORMAT";
b370: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b380: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b390: 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20  LITE_RANGE:     
b3a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b3b0: 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b   "SQLITE_RANGE";
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b3d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3e0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20  QLITE_NOTADB:   
b3f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b400: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  = "SQLITE_NOTADB
b410: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b420: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b430: 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20  SQLITE_ROW:     
b440: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b450: 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b   = "SQLITE_ROW";
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
b470: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b480: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20   SQLITE_NOTICE: 
b490: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b4a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
b4b0: 43 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  CE";            
b4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b4d0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  e SQLITE_NOTICE_
b4e0: 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61  RECOVER_WAL: zNa
b4f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
b500: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22  ICE_RECOVER_WAL"
b510: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b520: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
b530: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
b540: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b570: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
b580: 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  R_ROLLBACK"; bre
b590: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b5a0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20  QLITE_WARNING:  
b5b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b5c0: 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  = "SQLITE_WARNIN
b5d0: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  G";           br
b5e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b5f0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
b600: 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65  UTOINDEX:  zName
b610: 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49   = "SQLITE_WARNI
b620: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62  NG_AUTOINDEX"; b
b630: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b640: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20   SQLITE_DONE:   
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b660: 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45  e = "SQLITE_DONE
b670: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
b680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
b690: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
b6a0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
b6b0: 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20  ar zBuf[50];.   
b6c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b6d0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
b6e0: 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e  zBuf, "SQLITE_UN
b6f0: 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67  KNOWN(%d)", orig
b700: 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  Rc);.    zName =
b710: 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74   zBuf;.  }.  ret
b720: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
b730: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b740: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
b750: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
b760: 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
b770: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
b780: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
b790: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
b7a0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e  sqlite3ErrStr(in
b7b0: 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20  t rc){.  static 
b7c0: 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73  const char* cons
b7d0: 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20  t aMsg[] = {.   
b7e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20   /* SQLITE_OK   
b7f0: 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61         */ "not a
b800: 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  n error",.    /*
b810: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20   SQLITE_ERROR   
b820: 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69      */ "SQL logi
b830: 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69  c error or missi
b840: 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ng database",.  
b850: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
b860: 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20  RNAL    */ 0,.  
b870: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d    /* SQLITE_PERM
b880: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65          */ "acce
b890: 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65  ss permission de
b8a0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
b8b0: 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20  LITE_ABORT      
b8c0: 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65   */ "callback re
b8d0: 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62  quested query ab
b8e0: 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ort",.    /* SQL
b8f0: 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20  ITE_BUSY        
b900: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20  */ "database is 
b910: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
b920: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20  SQLITE_LOCKED   
b930: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
b940: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22  table is locked"
b950: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
b960: 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22  NOMEM       */ "
b970: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a  out of memory",.
b980: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45      /* SQLITE_RE
b990: 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74  ADONLY    */ "at
b9a0: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
b9b0: 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61   readonly databa
b9c0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
b9d0: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a  TE_INTERRUPT   *
b9e0: 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c  / "interrupted",
b9f0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
ba00: 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64  OERR       */ "d
ba10: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a  isk I/O error",.
ba20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
ba30: 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61  RRUPT     */ "da
ba40: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
ba50: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c  e is malformed",
ba60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
ba70: 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75  OTFOUND    */ "u
ba80: 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e  nknown operation
ba90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
baa0: 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20  _FULL        */ 
bab0: 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73  "database or dis
bac0: 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20  k is full",.    
bad0: 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  /* SQLITE_CANTOP
bae0: 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65  EN    */ "unable
baf0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
bb00: 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20  e file",.    /* 
bb10: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20  SQLITE_PROTOCOL 
bb20: 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70     */ "locking p
bb30: 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a  rotocol",.    /*
bb40: 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20   SQLITE_EMPTY   
bb50: 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f      */ "table co
bb60: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c  ntains no data",
bb70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53  .    /* SQLITE_S
bb80: 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64  CHEMA      */ "d
bb90: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
bba0: 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20  as changed",.   
bbb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   /* SQLITE_TOOBI
bbc0: 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e  G      */ "strin
bbd0: 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69  g or blob too bi
bbe0: 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  g",.    /* SQLIT
bbf0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f  E_CONSTRAINT  */
bc00: 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   "constraint fai
bc10: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
bc20: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20  ITE_MISMATCH    
bc30: 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73  */ "datatype mis
bc40: 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53  match",.    /* S
bc50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20  QLITE_MISUSE    
bc60: 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f    */ "library ro
bc70: 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74  utine called out
bc80: 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20   of sequence",. 
bc90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
bca0: 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72  FS       */ "lar
bcb0: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
bcc0: 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20  is disabled",.  
bcd0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48    /* SQLITE_AUTH
bce0: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68          */ "auth
bcf0: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64  orization denied
bd00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bd10: 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20  _FORMAT      */ 
bd20: 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62  "auxiliary datab
bd30: 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72  ase format error
bd40: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bd50: 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20  _RANGE       */ 
bd60: 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20  "bind or column 
bd70: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
bd80: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
bd90: 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a  TE_NOTADB      *
bda0: 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79  / "file is encry
bdb0: 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61  pted or is not a
bdc0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b   database",.  };
bdd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bde0: 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65  Err = "unknown e
bdf0: 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28  rror";.  switch(
be00: 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20   rc ){.    case 
be10: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
be20: 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a  LBACK: {.      z
be30: 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65  Err = "abort due
be40: 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   to ROLLBACK";. 
be50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
be60: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
be70: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
be80: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
be90: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
bea0: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
beb0: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
bec0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
bed0: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
bee0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
bef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bf00: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
bf10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bf20: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
bf30: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
bf40: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
bf50: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
bf60: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
bf70: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
bf80: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
bf90: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
bfa0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
bfb0: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
bfc0: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
bfd0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
bfe0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
bff0: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
c000: 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20  ck(. void *ptr, 
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c020: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
c030: 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75  tion */. int cou
c040: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
c050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
c060: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
c070: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23  een busy */.){.#
c080: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
c090: 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   || HAVE_USLEEP.
c0a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
c0b0: 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20  8 delays[] =.   
c0c0: 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c    { 1, 2, 5, 10,
c0d0: 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c   15, 20, 25, 25,
c0e0: 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20    25,  50,  50, 
c0f0: 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  100 };.  static 
c100: 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b  const u8 totals[
c110: 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c  ] =.     { 0, 1,
c120: 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20   3,  8, 18, 33, 
c130: 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38  53, 78, 103, 128
c140: 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20  , 178, 228 };.# 
c150: 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72  define NDELAY Ar
c160: 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a  raySize(delays).
c170: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c180: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
c190: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
c1a0: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  db->busyTimeout;
c1b0: 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72  .  int delay, pr
c1c0: 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ior;..  assert( 
c1d0: 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66  count>=0 );.  if
c1e0: 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59  ( count < NDELAY
c1f0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
c200: 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20  delays[count];. 
c210: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
c220: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73  s[count];.  }els
c230: 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  e{.    delay = d
c240: 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b  elays[NDELAY-1];
c250: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
c260: 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20  als[NDELAY-1] + 
c270: 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44  delay*(count-(ND
c280: 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  ELAY-1));.  }.  
c290: 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61  if( prior + dela
c2a0: 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  y > timeout ){. 
c2b0: 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f     delay = timeo
c2c0: 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20  ut - prior;.    
c2d0: 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72  if( delay<=0 ) r
c2e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
c2f0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
c300: 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30  ->pVfs, delay*10
c310: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
c320: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
c330: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
c340: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
c350: 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33  eout = ((sqlite3
c360: 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d   *)ptr)->busyTim
c370: 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75  eout;.  if( (cou
c380: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d  nt+1)*1000 > tim
c390: 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  eout ){.    retu
c3a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
c3b0: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
c3c0: 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20  Vfs, 1000000);. 
c3d0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
c3e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  f.}../*.** Invok
c3f0: 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79  e the given busy
c400: 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   handler..**.** 
c410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c420: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f  called when an o
c430: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  peration failed 
c440: 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20  with a lock..** 
c450: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
c460: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
c470: 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65  , the lock is re
c480: 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  tried.  If it.**
c490: 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20   returns 0, the 
c4a0: 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73  operation aborts
c4b0: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
c4c0: 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  BUSY error..*/.i
c4d0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  nt sqlite3Invoke
c4e0: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79  BusyHandler(Busy
c4f0: 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69  Handler *p){.  i
c500: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56  nt rc;.  if( NEV
c510: 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78  ER(p==0) || p->x
c520: 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42  Func==0 || p->nB
c530: 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30  usy<0 ) return 0
c540: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e  ;.  rc = p->xFun
c550: 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42  c(p->pArg, p->nB
c560: 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  usy);.  if( rc==
c570: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  0 ){.    p->nBus
c580: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
c590: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b  .    p->nBusy++;
c5a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c5b0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ; .}../*.** This
c5c0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
c5d0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
c5e0: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
c5f0: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
c600: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
c610: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
c620: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
c630: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c640: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20  _busy_handler(. 
c650: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c660: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
c670: 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  d*,int),.  void 
c680: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
c690: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
c6a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
c6b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
c6c0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
c6d0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
c6e0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
c6f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
c700: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62  >mutex);.  db->b
c710: 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63  usyHandler.xFunc
c720: 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e   = xBusy;.  db->
c730: 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67  busyHandler.pArg
c740: 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62   = pArg;.  db->b
c750: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
c760: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
c770: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73  Timeout = 0;.  s
c780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
c790: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
c7a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c7b0: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
c7c0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
c7d0: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
c7e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
c7f0: 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73  ets the progress
c800: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
c810: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
c820: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
c830: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
c840: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
c850: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  n argument. The 
c860: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
c870: 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76  k will.** be inv
c880: 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20  oked every nOps 
c890: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64  opcodes..*/.void
c8a0: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
c8b0: 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  s_handler(.  sql
c8c0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
c8d0: 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78   nOps,.  int (*x
c8e0: 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29  Progress)(void*)
c8f0: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  , .  void *pArg.
c900: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
c910: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
c920: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
c930: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
c940: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
c950: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
c960: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
c970: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
c980: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c990: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
c9a0: 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20  ( nOps>0 ){.    
c9b0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
c9c0: 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64  xProgress;.    d
c9d0: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
c9e0: 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73  = (unsigned)nOps
c9f0: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
ca00: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
ca10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
ca20: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
ca30: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
ca40: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
ca50: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
ca60: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
ca70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
ca80: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
ca90: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
caa0: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
cab0: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
cac0: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
cad0: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
cae0: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
caf0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
cb00: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
cb10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cb20: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
cb30: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
cb40: 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  s){.#ifdef SQLIT
cb50: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
cb60: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
cb70: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
cb80: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
cb90: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
cba0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e  #endif.  if( ms>
cbb0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cbc0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
cbd0: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
cbe0: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
cbf0: 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d  id*)db);.    db-
cc00: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
cc10: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
cc20: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
cc30: 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a  dler(db, 0, 0);.
cc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
cc50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cc60: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
cc70: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
cc80: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
cc90: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
cca0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ccb0: 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69  3_interrupt(sqli
ccc0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
ccd0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
cce0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
ccf0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
cd00: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
cd10: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
cd20: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
cd30: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
cd40: 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  .  db->u1.isInte
cd50: 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a  rrupted = 1;.}..
cd60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
cd70: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
cd80: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
cd90: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
cda0: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
cdb0: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
cdc0: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
cdd0: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
cde0: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
cdf0: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
ce00: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
ce10: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
ce20: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
ce30: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
ce40: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
ce50: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
ce60: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
ce70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
ce80: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
ce90: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
cea0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
ceb0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
cec0: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
ced0: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
cee0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
cef0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cf00: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
cf10: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
cf20: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
cf30: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
cf40: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
cf50: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
cf60: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
cf70: 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  t*),.  FuncDestr
cf80: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
cf90: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
cfa0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
cfb0: 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67  .  int extraFlag
cfc0: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  s;..  assert( sq
cfd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cfe0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
cff0: 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61   if( zFunctionNa
d000: 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28  me==0 ||.      (
d010: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
d020: 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a   || xStep)) || .
d030: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
d040: 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74   (xFinal && !xSt
d050: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21  ep)) ||.      (!
d060: 78 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61  xFunc && (!xFina
d070: 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a  l && xStep)) ||.
d080: 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c        (nArg<-1 |
d090: 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41  | nArg>SQLITE_MA
d0a0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20  X_FUNCTION_ARG) 
d0b0: 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e  ||.      (255<(n
d0c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
d0d0: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
d0e0: 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20  nName))) ){.    
d0f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d100: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
d110: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
d120: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d  _FUNC_CONSTANT==
d130: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
d140: 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46  STIC );.  extraF
d150: 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51  lags = enc &  SQ
d160: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
d170: 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51  IC;.  enc &= (SQ
d180: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
d190: 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20  K|SQLITE_ANY);. 
d1a0: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
d1b0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
d1c0: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
d1d0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
d1e0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
d1f0: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
d200: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
d210: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
d220: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
d230: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
d240: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
d250: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
d260: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
d270: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
d280: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51  .  **.  ** If SQ
d290: 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63  LITE_ANY is spec
d2a0: 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65  ified, add three
d2b0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
d2c0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74   function.  ** t
d2d0: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
d2e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63  ..  */.  if( enc
d2f0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
d300: 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  {.    enc = SQLI
d310: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
d320: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d    }else if( enc=
d330: 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20  =SQLITE_ANY ){. 
d340: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72     int rc;.    r
d350: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
d360: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
d370: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
d380: 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61  QLITE_UTF8|extra
d390: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
d3a0: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
d3b0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
d3c0: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
d3d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d3e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
d3f0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
d400: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
d410: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
d420: 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74  LITE_UTF16LE|ext
d430: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
d440: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
d450: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
d460: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
d470: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d480: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d490: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
d4a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
d4b0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
d4c0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
d4d0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
d4e0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
d4f0: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
d500: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
d510: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
d520: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
d530: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
d540: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
d550: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
d560: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
d570: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
d580: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
d590: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
d5a0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
d5b0: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
d5c0: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
d5d0: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
d5e0: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
d5f0: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
d600: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
d610: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
d620: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
d630: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
d640: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
d650: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
d660: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
d670: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
d680: 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  ASK)==enc && p->
d690: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
d6a0: 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
d6b0: 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
d6c0: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
d6d0: 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
d6e0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
d6f0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
d700: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
d710: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
d720: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
d730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
d740: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d750: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d760: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
d770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
d780: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
d790: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
d7a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
d7b0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
d7c0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
d7d0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
d7e0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
d7f0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
d800: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
d810: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
d820: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d830: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
d840: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
d850: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
d860: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
d870: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
d880: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
d890: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
d8a0: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
d8b0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
d8c0: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
d8d0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
d8e0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
d8f0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
d900: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
d910: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
d920: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
d930: 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  ;.  p->funcFlags
d940: 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73   = (p->funcFlags
d950: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
d960: 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46  NCMASK) | extraF
d970: 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65  lags;.  testcase
d980: 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  ( p->funcFlags &
d990: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
d9a0: 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46  ISTIC );.  p->xF
d9b0: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
d9c0: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
d9d0: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
d9e0: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
d9f0: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
da00: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
da10: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
da20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
da30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
da40: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
da50: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
da60: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
da70: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
da80: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
da90: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
daa0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
dab0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
dac0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
dad0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
dae0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
daf0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
db00: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
db10: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
db20: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
db30: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
db40: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
db50: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
db60: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
db70: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
db80: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
db90: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
dbd0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
dbe0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
dbf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
dc00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
dc10: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
dc20: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
dc30: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
dc40: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
dc50: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
dc60: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
dc70: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
dc80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
dc90: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
dca0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
dcb0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
dcc0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
dcd0: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
dce0: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
dcf0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
dd00: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
dd10: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66   *pArg = 0;..#if
dd20: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
dd30: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
dd40: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
dd50: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
dd60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd70: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
dd80: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
dd90: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
dda0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
ddb0: 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20   xDestroy ){.   
ddc0: 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73   pArg = (FuncDes
ddd0: 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65  tructor *)sqlite
dde0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ddf0: 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73  , sizeof(FuncDes
de00: 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69  tructor));.    i
de10: 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20  f( !pArg ){.    
de20: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
de30: 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20       goto out;. 
de40: 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78     }.    pArg->x
de50: 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72  Destroy = xDestr
de60: 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55  oy;.    pArg->pU
de70: 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d  serData = p;.  }
de80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
de90: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
dea0: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
deb0: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
dec0: 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a   xFinal, pArg);.
ded0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
dee0: 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  rg->nRef==0 ){. 
def0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
df00: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
df10: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
df20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
df30: 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  b, pArg);.  }.. 
df40: 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  out:.  rc = sqli
df50: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
df60: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
df70: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
df80: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
df90: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
dfa0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
dfb0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
dfc0: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20  te_function16(. 
dfd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
dfe0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e  const void *zFun
dff0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
e000: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65   nArg,.  int eTe
e010: 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70  xtRep,.  void *p
e020: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
e030: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e040: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e050: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
e060: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e070: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e080: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
e090: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
e0a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e0b0: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
e0c0: 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a    char *zFunc8;.
e0d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e0e0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e0f0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
e100: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
e110: 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  || zFunctionName
e120: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
e130: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e140: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
e150: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e160: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
e170: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
e180: 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63  ailed );.  zFunc
e190: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
e1a0: 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  to8(db, zFunctio
e1b0: 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  nName, -1, SQLIT
e1c0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
e1d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
e1e0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
e1f0: 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74  nc8, nArg, eText
e200: 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  Rep, p, xFunc, x
e210: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b  Step, xFinal,0);
e220: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e230: 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20  (db, zFunc8);.  
e240: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
e250: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
e260: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e270: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
e280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
e290: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ndif.../*.** Dec
e2a0: 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
e2b0: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
e2c0: 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
e2d0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
e2e0: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
e2f0: 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
e300: 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
e310: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
e320: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
e330: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
e340: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
e350: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
e360: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
e370: 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
e380: 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
e390: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
e3a0: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
e3b0: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
e3c0: 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
e3d0: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
e3e0: 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
e3f0: 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
e400: 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
e410: 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
e420: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
e430: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
e440: 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
e450: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
e460: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
e470: 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
e480: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e490: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
e4a0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
e4b0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e4c0: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
e4d0: 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d  rg.){.  int nNam
e4e0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
e4f0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e  n30(zName);.  in
e500: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e510: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e520: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e530: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e540: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
e550: 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
e560: 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
e570: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e580: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
e590: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e5a0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e5b0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
e5c0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
e5d0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
e5e0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
e5f0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
e600: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e610: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
e620: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
e630: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
e660: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
e670: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
e680: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
e690: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
e6a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e6b0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
e6c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
e6d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e6e0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
e6f0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
e700: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
e710: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
e720: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
e730: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
e740: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
e750: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
e760: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
e770: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
e780: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
e790: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
e7a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
e7b0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
e7c0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
e7d0: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
e7e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
e7f0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
e800: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
e810: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
e820: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
e830: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
e840: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
e850: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e860: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e870: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e880: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
e890: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
e8a0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e8b0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e8c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
e8d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e8e0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e8f0: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
e900: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61  eArg;.  db->xTra
e910: 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64  ce = xTrace;.  d
e920: 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
e930: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
e940: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e950: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e960: 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  pOld;.}./*.** Re
e970: 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
e980: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
e990: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
e9a0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
e9b0: 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
e9c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
e9d0: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
e9e0: 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
e9f0: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
ea00: 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
ea10: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
ea20: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
ea30: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
ea40: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
ea50: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
ea60: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
ea70: 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
ea80: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
ea90: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
eaa0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
eab0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
eac0: 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
ead0: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
eae0: 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
eaf0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
eb00: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
eb10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
eb20: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
eb30: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
eb40: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
eb50: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
eb60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
eb70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
eb80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
eb90: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
eba0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
ebb0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
ebc0: 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
ebd0: 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
ebe0: 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
ebf0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
ec00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ec10: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
ec20: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
ec30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ec40: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
ec50: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
ec60: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
ec70: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
ec80: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
ec90: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76  s..** If the inv
eca0: 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65  oked function re
ecb0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
ecc0: 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
ecd0: 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
ece0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
ecf0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
ed00: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
ed10: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
ed20: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
ed30: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
ed40: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  base */.  int (*
ed50: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
ed60: 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ),  /* Function 
ed70: 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63  to invoke on eac
ed80: 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f  h commit */.  vo
ed90: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
eda0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
edb0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
edc0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
edd0: 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
ede0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
edf0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
ee00: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
ee10: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
ee20: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
ee30: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
ee40: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
ee50: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
ee60: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
ee70: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
ee80: 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
ee90: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
eea0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
eeb0: 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
eec0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
eed0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
eee0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
eef0: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
ef00: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
ef10: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
ef20: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
ef30: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
ef40: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
ef50: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
ef60: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
ef70: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
ef80: 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
ef90: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
efa0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
efb0: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
efc0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
efd0: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
efe0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
eff0: 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
f000: 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
f010: 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
f020: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
f030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f040: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
f050: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
f060: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66  void *pRet;..#if
f070: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f080: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f090: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f0a0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f0b0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
f0c0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
f0d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
f0e0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f0f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f100: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
f110: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
f120: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
f130: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
f140: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
f150: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f160: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f170: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f180: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
f190: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f1a0: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
f1b0: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
f1c0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
f1d0: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
f1e0: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
f1f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
f200: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
f210: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
f220: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
f230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f240: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
f250: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
f260: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
f270: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
f280: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
f290: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
f2a0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
f2b0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
f2c0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
f2d0: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
f2e0: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
f2f0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f300: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f310: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f320: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f330: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f340: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f350: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f360: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f370: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f380: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
f390: 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
f3a0: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
f3b0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
f3c0: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
f3d0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
f3e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f3f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f400: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
f410: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f420: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20  T_WAL./*.** The 
f430: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
f440: 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  () callback regi
f450: 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65  stered by sqlite
f460: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
f470: 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b  oint()..** Invok
f480: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
f490: 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
f4a0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
f4b0: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
f4c0: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
f4d0: 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c  han sqlite3.pWal
f4e0: 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69  Arg cast to an i
f4f0: 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75  nteger (the valu
f500: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a  e configured by.
f510: 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  ** wal_autocheck
f520: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e  point())..*/ .in
f530: 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  t sqlite3WalDefa
f540: 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20  ultHook(.  void 
f550: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  *pClientData,   
f560: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f    /* Argument */
f570: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
f580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
f590: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
f5a0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
f5b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
f5c0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20  */.  int nFrame 
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f5e0: 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b  ize of WAL */.){
f5f0: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53  .  if( nFrame>=S
f600: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
f610: 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b  (pClientData) ){
f620: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
f630: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
f640: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
f650: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
f660: 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  zDb);.    sqlite
f670: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
f680: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
f690: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
f6a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f6b0: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
f6c0: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
f6d0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
f6e0: 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
f6f0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
f700: 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
f710: 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
f720: 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
f730: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
f740: 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
f750: 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
f760: 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
f770: 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
f780: 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
f790: 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
f7a0: 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
f7b0: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
f7c0: 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
f7d0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
f7e0: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
f7f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
f800: 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
f810: 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
f820: 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
f830: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
f840: 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
f850: 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
f860: 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
f870: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
f880: 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
f890: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
f8a0: 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
f8b0: 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
f8c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
f8d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
f8e0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
f8f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
f900: 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65  t nFrame){.#ifde
f910: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
f920: 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  L.  UNUSED_PARAM
f930: 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
f940: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72  ED_PARAMETER(nFr
f950: 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64  ame);.#else.#ifd
f960: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f970: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
f980: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f990: 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
f9a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
f9b0: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
f9c0: 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b   if( nFrame>0 ){
f9d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
f9e0: 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65  _hook(db, sqlite
f9f0: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c  3WalDefaultHook,
fa00: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
fa10: 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d  TR(nFrame));.  }
fa20: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
fa30: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30  3_wal_hook(db, 0
fa40: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
fa50: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fa60: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
fa70: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
fa80: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
fa90: 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
faa0: 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74  saction is writt
fab0: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77  en.** into the w
fac0: 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62  rite-ahead-log b
fad0: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
fae0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
faf0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c  oid *sqlite3_wal
fb00: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
fb10: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
fb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
fb30: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
fb40: 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  his db handle */
fb50: 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63  .  int(*xCallbac
fb60: 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74  k)(void *, sqlit
fb70: 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  e3*, const char*
fb80: 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  , int),.  void *
fb90: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
fba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
fbb0: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
fbc0: 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28  ed to xCallback(
fbd0: 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  ) */.){.#ifndef 
fbe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
fbf0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69    void *pRet;.#i
fc00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
fc10: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
fc20: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
fc30: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
fc40: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
fc50: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
fc60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
fc70: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
fc80: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
fc90: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
fca0: 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20  = db->pWalArg;. 
fcb0: 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63   db->xWalCallbac
fcc0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
fcd0: 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70   db->pWalArg = p
fce0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
fcf0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
fd00: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
fd10: 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65  pRet;.#else.  re
fd20: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
fd30: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
fd40: 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
fd50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
fd60: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
fd70: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
fd80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fd90: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
fda0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
fdb0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdd0: 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64  Name of attached
fde0: 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55   database (or NU
fdf0: 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f  LL) */.  int eMo
fe00: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
fe10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
fe20: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20  TE_CHECKPOINT_* 
fe30: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
fe40: 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20  pnLog,          
fe50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
fe60: 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c  T: Size of WAL l
fe70: 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a  og in frames */.
fe80: 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20    int *pnCkpt   
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20    /* OUT: Total 
feb0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
fec0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f   checkpointed */
fed0: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
fee0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74  E_OMIT_WAL.  ret
fef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
ff00: 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20  else.  int rc;  
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
ff30: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
ff40: 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  Db = SQLITE_MAX_
ff50: 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71  ATTACHED;  /* sq
ff60: 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65  lite3.aDb[] inde
ff70: 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b  x of db to check
ff80: 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66  point */..#ifdef
ff90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
ffa0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
ffb0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
ffc0: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
ffd0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
ffe0: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  BKPT;.#endif..  
fff0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
10000 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
10010 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65  es to -1 in case
10020 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10030 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67  . */.  if( pnLog
10040 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a   ) *pnLog = -1;.
10050 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a    if( pnCkpt ) *
10060 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20  pnCkpt = -1;..  
10070 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
10080 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
10090 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  E==0 );.  assert
100a0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
100b0 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20  INT_FULL==1 );. 
100c0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
100d0 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
100e0 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  RT==2 );.  asser
100f0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
10100 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33  OINT_TRUNCATE==3
10110 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c   );.  if( eMode<
10120 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10130 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f  T_PASSIVE || eMo
10140 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de>SQLITE_CHECKP
10150 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b  OINT_TRUNCATE ){
10160 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10170 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30  -OF: R-03996-120
10180 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74  88 The M paramet
10190 65 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c  er must be a val
101a0 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20  id checkpoint.  
101b0 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20    ** mode: */.  
101c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
101d0 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73  MISUSE;.  }..  s
101e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
101f0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10200 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b   if( zDb && zDb[
10210 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  0] ){.    iDb = 
10220 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
10230 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a  e(db, zDb);.  }.
10240 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
10250 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
10260 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
10270 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
10280 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
10290 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
102a0 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20  e: %s", zDb);.  
102b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
102c0 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
102d0 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65  t(db, iDb, eMode
102e0 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
102f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
10300 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a  or(db, rc);.  }.
10310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
10320 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
10330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10340 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
10360 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
10370 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
10380 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
10390 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
103a0 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
103b0 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
103c0 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
103d0 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
103e0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
103f0 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
10400 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
10410 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10420 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
10430 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
10440 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ){.  /* EVIDENCE
10450 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35  -OF: R-41613-205
10460 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  53 The sqlite3_w
10470 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c  al_checkpoint(D,
10480 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  X) is equivalent
10490 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
104a0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
104b0 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48  v2(D,X,SQLITE_CH
104c0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
104d0 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75  ,0,0). */.  retu
104e0 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
104f0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
10500 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  zDb,SQLITE_CHECK
10510 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
10520 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
10530 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
10540 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b  *.** Run a check
10550 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73  point on databas
10560 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61  e iDb. This is a
10570 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61   no-op if databa
10580 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74  se iDb is.** not
10590 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
105a0 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  in WAL mode..**.
105b0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
105c0 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
105d0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
105e0 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20  g checkpointed, 
105f0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
10600 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
10610 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68  _LOCKED and a ch
10620 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  eckpoint is not 
10630 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a  attempted. If .*
10640 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
10650 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  s while running 
10660 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  the checkpoint, 
10670 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
10680 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
10690 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54  rned (i.e. SQLIT
106a0 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77  E_IOERR). Otherw
106b0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
106c0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
106d0 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
106e0 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20  le db should be 
106f0 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c  held by the call
10700 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a  er. The mutex.**
10710 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10720 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d   the specific b-
10730 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
10740 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e  pointed is taken
10750 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63   by.** this func
10760 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63  tion while the c
10770 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e  heckpoint is run
10780 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ning..**.** If i
10790 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c  Db is passed SQL
107a0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
107b0 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63  , then all attac
107c0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
107d0 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65  e.** checkpointe
107e0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  d. If an error i
107f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
10800 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
10810 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f  ediately -.** no
10820 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
10830 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   to checkpoint a
10840 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74  ny remaining dat
10850 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61  abases..**.** Pa
10860 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73  rameter eMode is
10870 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
10880 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
10890 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41  E, FULL or RESTA
108a0 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  RT..*/.int sqlit
108b0 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  e3Checkpoint(sql
108c0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
108d0 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e  b, int eMode, in
108e0 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70  t *pnLog, int *p
108f0 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63  nCkpt){.  int rc
10900 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
10910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10920 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
10930 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10950 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
10960 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65   through attache
10970 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62  d dbs */.  int b
10980 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Busy = 0;       
10990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
109a0 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53  ue if SQLITE_BUS
109b0 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75  Y has been encou
109c0 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ntered */..  ass
109d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
109e0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
109f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
10a00 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67  !pnLog || *pnLog
10a10 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ==-1 );.  assert
10a20 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e  ( !pnCkpt || *pn
10a30 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66  Ckpt==-1 );..  f
10a40 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10a50 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b && rc==SQLITE_
10a60 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  OK; i++){.    if
10a70 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d  ( i==iDb || iDb=
10a80 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
10a90 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63  CHED ){.      rc
10aa0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
10ab0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44  heckpoint(db->aD
10ac0 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c  b[i].pBt, eMode,
10ad0 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
10ae0 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30  .      pnLog = 0
10af0 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d  ;.      pnCkpt =
10b00 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
10b10 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
10b20 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d  .        bBusy =
10b30 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
10b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10b50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10b60 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
10b70 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29  ITE_OK && bBusy)
10b80 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
10b90 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
10ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
10bb0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
10bc0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
10bd0 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
10be0 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
10bf0 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
10c00 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
10c10 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
10c20 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
10c30 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
10c40 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
10c50 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
10c60 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
10c70 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
10c80 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
10c90 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
10ca0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
10cb0 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
10cc0 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
10cd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
10ce0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
10cf0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
10d00 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
10d10 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
10d20 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
10d30 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
10d40 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
10d50 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
10d60 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
10d70 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
10d80 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
10da0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
10db0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dd0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
10e00 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
10e10 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
10e40 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
10e50 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
10e60 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
10e70 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
10e80 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
10e90 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
10ea0 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
10eb0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
10ed0 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
10ee0 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
10f20 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
10f50 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
10f60 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
10f90 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
10fa0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
10fb0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
10fc0 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
10fd0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
10fe0 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
10ff0 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
11000 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
11010 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
11020 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11030 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
11040 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
11050 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
11060 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11070 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
11080 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
11090 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
110a0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
110b0 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31  RE==3.  return 1
110c0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
110d0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31  ITE_TEMP_STORE<1
110e0 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   || SQLITE_TEMP_
110f0 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e  STORE>3.  return
11100 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
11110 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38  .** Return UTF-8
11120 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
11130 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
11140 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
11150 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
11160 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
11170 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
11180 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
11190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
111a0 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
111b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
111c0 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
111d0 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  EM);.  }.  if( !
111e0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
111f0 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
11200 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
11210 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
11220 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a  E_MISUSE_BKPT);.
11230 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
11240 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
11250 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
11260 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11270 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
11280 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
11290 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EM);.  }else{.  
112a0 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
112b0 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a  pErr==0 );.    z
112c0 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
112d0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
112e0 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65  >pErr);.    asse
112f0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
11300 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
11310 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   z==0 ){.      z
11320 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
11330 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
11340 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
11350 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11360 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11370 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
11380 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
11390 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
113a0 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
113b0 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
113c0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
113d0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
113e0 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
113f0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
11400 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
11410 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
11420 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66   const u16 outOf
11430 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f  Mem[] = {.    'o
11440 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
11450 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c  , 'o', 'f', ' ',
11460 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20   'm', 'e', 'm', 
11470 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30  'o', 'r', 'y', 0
11480 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
11490 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b  onst u16 misuse[
114a0 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27  ] = {.    'l', '
114b0 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61  i', 'b', 'r', 'a
114c0 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27  ', 'r', 'y', ' '
114d0 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c  , .    'r', 'o',
114e0 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20   'u', 't', 'i', 
114f0 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a  'n', 'e', ' ', .
11500 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c      'c', 'a', 'l
11510 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27  ', 'l', 'e', 'd'
11520 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
11530 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
11540 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27  .    'o', 'f', '
11550 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65   ', .    's', 'e
11560 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27  ', 'q', 'u', 'e'
11570 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c  , 'n', 'c', 'e',
11580 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
11590 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
115a0 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
115b0 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
115c0 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
115d0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
115e0 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
115f0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
11600 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
11610 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11620 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
11630 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
11640 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11650 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
11660 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
11670 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
11680 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
11690 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
116a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
116b0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
116c0 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65  (db, db->errCode
116d0 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
116e0 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20  db->errCode));. 
116f0 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
11700 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
11710 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
11720 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
11730 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
11740 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
11750 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
11760 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
11770 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
11780 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
11790 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
117a0 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
117b0 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
117c0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
117d0 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
117e0 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
117f0 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
11800 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
11810 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
11820 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
11830 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
11840 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
11850 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
11860 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  led = 0;.  }.  s
11870 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11880 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
11890 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
118a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
118b0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
118c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
118d0 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
118e0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
118f0 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
11900 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
11910 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
11920 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
11930 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
11940 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
11950 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
11960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
11970 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
11980 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
11990 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
119a0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
119b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
119c0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
119d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
119e0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
119f0 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
11a00 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
11a10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
11a20 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65  >errCode & db->e
11a30 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71  rrMask;.}.int sq
11a40 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
11a50 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
11a60 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
11a70 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
11a80 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
11a90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11aa0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
11ab0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
11ac0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
11ad0 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
11ae0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
11af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
11b00 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ->errCode;.}../*
11b10 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
11b20 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
11b30 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
11b40 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
11b50 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
11b60 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69  t.  For now, thi
11b70 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74  s simply calls t
11b80 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69  he internal sqli
11b90 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66  te3ErrStr().** f
11ba0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  unction..*/.cons
11bb0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
11bc0 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a  errstr(int rc){.
11bd0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
11be0 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f  ErrStr(rc);.}../
11bf0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
11c00 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  w collating func
11c10 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73  tion for databas
11c20 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d  e "db".  The nam
11c30 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e  e is zName.** an
11c40 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  d the encoding i
11c50 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  s enc..*/.static
11c60 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61   int createColla
11c70 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
11c80 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   db,.  const cha
11c90 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20  r *zName, .  u8 
11ca0 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74  enc,.  void* pCt
11cb0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
11cc0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
11cd0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
11ce0 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
11cf0 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
11d00 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
11d10 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32  Coll;.  int enc2
11d20 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
11d30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11d40 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
11d50 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
11d60 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
11d70 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
11d80 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
11d90 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
11da0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
11db0 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
11dc0 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
11dd0 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
11de0 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
11df0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
11e00 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
11e10 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
11e20 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
11e30 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
11e40 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
11e50 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
11e60 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
11e70 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
11e80 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
11e90 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
11ea0 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
11eb0 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
11ec0 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
11ed0 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
11ee0 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
11ef0 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
11f00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11f10 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
11f20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
11f30 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
11f40 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
11f50 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
11f60 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
11f70 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
11f80 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
11f90 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
11fa0 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
11fb0 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
11fc0 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
11fd0 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
11fe0 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
11ff0 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
12000 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
12010 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
12020 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
12030 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
12040 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
12050 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
12060 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
12070 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
12080 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
12090 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
120a0 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
120b0 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
120c0 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
120d0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
120e0 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
120f0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
12100 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12110 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
12120 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
12130 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
12140 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
12150 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
12160 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
12170 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
12180 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
12190 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
121a0 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
121b0 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
121c0 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
121d0 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
121e0 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
121f0 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
12200 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
12210 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
12220 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
12230 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
12240 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
12250 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
12260 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
12270 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
12280 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
12290 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
122a0 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
122b0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
122c0 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
122d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  zName);.      in
122e0 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
122f0 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
12300 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
12310 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
12320 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
12330 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
12340 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12350 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
12360 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
12370 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
12380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
12390 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
123a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
123b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
123c0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
123d0 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
123e0 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
123f0 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
12400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12410 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
12420 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
12430 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
12440 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
12450 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
12460 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
12470 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
12480 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
12490 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
124a0 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
124b0 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OK);.  return SQ
124c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
124d0 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65  ** This array de
124e0 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72  fines hard upper
124f0 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74   bounds on limit
12500 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a   values.  The.**
12510 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73   initializer mus
12520 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e  t be kept in syn
12530 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  c with the SQLIT
12540 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65  E_LIMIT_*.** #de
12550 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33  fines in sqlite3
12560 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  .h..*/.static co
12570 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d  nst int aHardLim
12580 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54  it[] = {.  SQLIT
12590 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20  E_MAX_LENGTH,.  
125a0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
125b0 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
125c0 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51  MAX_COLUMN,.  SQ
125d0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
125e0 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
125f0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
12600 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  T,.  SQLITE_MAX_
12610 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54  VDBE_OP,.  SQLIT
12620 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
12630 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  RG,.  SQLITE_MAX
12640 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c  _ATTACHED,.  SQL
12650 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
12660 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  TERN_LENGTH,.  S
12670 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
12680 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20  LE_NUMBER,      
12690 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d  /* IMP: R-38091-
126a0 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54  32352 */.  SQLIT
126b0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
126c0 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
126d0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
126e0 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
126f0 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
12700 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
12710 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
12720 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
12730 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
12740 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
12750 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
12760 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
12770 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
12780 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
12790 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
127a0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
127b0 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
127c0 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
127d0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
127e0 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
127f0 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
12800 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
12810 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
12820 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
12830 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
12840 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
12850 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
12860 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
12870 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
12880 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
12890 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
128a0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
128b0 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
128c0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
128d0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
128e0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
128f0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
12900 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
12910 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
12920 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
12930 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51  >1000.# error SQ
12940 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
12950 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65  N_ARG must be be
12960 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30  tween 0 and 1000
12970 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
12980 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c  TE_MAX_ATTACHED<
12990 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
129a0 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65  ATTACHED>125.# e
129b0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
129c0 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65  ATTACHED must be
129d0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
129e0 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  25.#endif.#if SQ
129f0 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
12a00 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
12a10 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
12a20 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
12a30 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
12a40 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
12a50 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
12a60 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
12a70 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
12a80 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
12a90 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
12aa0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
12ab0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c  X_TRIGGER_DEPTH<
12ac0 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
12ad0 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
12ae0 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
12af0 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
12b00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
12b10 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20  ER_THREADS<0 || 
12b20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
12b30 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65  R_THREADS>50.# e
12b40 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
12b50 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d  WORKER_THREADS m
12b60 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
12b70 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a   and 50.#endif..
12b80 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
12b90 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
12ba0 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
12bb0 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
12bc0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
12bd0 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
12be0 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
12bf0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
12c00 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
12c10 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
12c20 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
12c30 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
12c40 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
12c50 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
12c60 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
12c70 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
12c80 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
12c90 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
12ca0 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
12cb0 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
12cc0 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
12cd0 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
12ce0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
12cf0 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
12d00 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
12d10 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65  oldLimit;..#ifde
12d20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12d30 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
12d40 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
12d50 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
12d60 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
12d70 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
12d80 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
12d90 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45  ndif..  /* EVIDE
12da0 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d  NCE-OF: R-30189-
12db0 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c  54097 For each l
12dc0 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51  imit category SQ
12dd0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a  LITE_LIMIT_NAME.
12de0 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
12df0 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
12e00 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
12e10 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70  time by a C prep
12e20 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61  rocessor.  ** ma
12e30 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54  cro called SQLIT
12e40 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65  E_MAX_NAME. (The
12e50 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68   "_LIMIT_" in th
12e60 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65  e name is change
12e70 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f  d to.  ** "_MAX_
12e80 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ".).  */.  asser
12e90 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
12ea0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
12eb0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  H]==SQLITE_MAX_L
12ec0 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
12ed0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
12ee0 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
12ef0 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
12f00 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b  AX_SQL_LENGTH );
12f10 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
12f20 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
12f30 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49  IT_COLUMN]==SQLI
12f40 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b  TE_MAX_COLUMN );
12f50 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
12f60 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
12f70 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d  IT_EXPR_DEPTH]==
12f80 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
12f90 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
12fa0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
12fb0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
12fc0 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c  UND_SELECT]==SQL
12fd0 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
12fe0 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65  _SELECT);.  asse
12ff0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13000 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
13010 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  _OP]==SQLITE_MAX
13020 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73  _VDBE_OP );.  as
13030 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13040 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  [SQLITE_LIMIT_FU
13050 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c  NCTION_ARG]==SQL
13060 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
13070 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74  _ARG );.  assert
13080 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13090 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
130a0 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ED]==SQLITE_MAX_
130b0 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73  ATTACHED );.  as
130c0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
130d0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
130e0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
130f0 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  H]==.           
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c      SQLITE_MAX_L
13130 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
13140 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13150 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13160 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
13170 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45  _NUMBER]==SQLITE
13180 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
13190 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28  MBER);.  assert(
131a0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
131b0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
131c0 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
131d0 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
131e0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
131f0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13200 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
13210 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d  READS]==SQLITE_M
13220 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13230 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  S );.  assert( S
13240 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
13250 45 52 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c  ER_THREADS==(SQL
13260 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29  ITE_N_LIMIT-1) )
13270 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  ;...  if( limitI
13280 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
13290 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
132a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
132b0 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
132c0 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
132d0 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
132e0 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20  Limit>=0 ){     
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13300 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38   IMP: R-52476-28
13310 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  732 */.    if( n
13320 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
13330 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
13340 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
13350 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
13360 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  Id];  /* IMP: R-
13370 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20  51463-25634 */. 
13380 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
13390 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
133a0 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
133b0 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20  eturn oldLimit; 
133c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133d0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33      /* IMP: R-53
133e0 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a  341-35419 */.}..
133f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13400 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
13410 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61  arse both URIs a
13420 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  nd non-URI filen
13430 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74  ames passed by t
13440 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50  he.** user to AP
13450 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  I functions sqli
13460 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  te3_open() or sq
13470 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c  lite3_open_v2(),
13480 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73   and for databas
13490 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66  e.** URIs specif
134a0 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41  ied as part of A
134b0 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73  TTACH statements
134c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
134d0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
134e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
134f0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
13500 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a  FS to use (or.**
13510 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69   a NULL to signi
13520 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  fy the default V
13530 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64  FS) if the URI d
13540 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
13550 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71  a "vfs=xxx".** q
13560 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20  uery parameter. 
13570 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
13580 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ent contains the
13590 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49   URI (or non-URI
135a0 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74   filename).** it
135b0 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20  self. When this 
135c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
135d0 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76  ed the *pFlags v
135e0 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  ariable should c
135f0 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65  ontain.** the de
13600 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f  fault flags to o
13610 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
13620 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68   handle with. Th
13630 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
13640 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79  n.** *pFlags may
13650 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f   be updated befo
13660 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20  re returning if 
13670 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  the URI filename
13680 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63   contains .** "c
13690 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f  ache=xxx" or "mo
136a0 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61  de=xxx" query pa
136b0 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  rameters..**.** 
136c0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
136d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
136e0 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
136f0 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74  se *ppVfs is set
13700 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
13710 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f  the VFS that sho
13720 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f  uld be used to o
13730 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
13740 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69   file. *pzFile i
13750 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
13760 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
13770 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
13780 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
13790 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65   open. It is the
137a0 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
137b0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
137c0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
137d0 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
137e0 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a  e() to release.*
137f0 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a  * this buffer..*
13800 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
13810 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e   occurs, then an
13820 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
13830 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
13840 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20  nd *pzErrMsg.** 
13850 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
13860 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
13870 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e  containing an En
13880 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
13890 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
138a0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
138b0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
138c0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
138d0 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a  tually release.*
138e0 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79  * this buffer by
138f0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
13900 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _free()..*/.int 
13910 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
13920 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13930 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20  DefaultVfs,     
13940 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
13950 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22   if no "vfs=xxx"
13960 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f   query option */
13970 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13980 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uri,            
13990 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
139a0 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73  ated URI to pars
139b0 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
139c0 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
139d0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
139e0 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  : SQLITE_OPEN_XX
139f0 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
13a00 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73  ite3_vfs **ppVfs
13a10 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13a20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20  OUT: VFS to use 
13a30 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46  */ .  char **pzF
13a40 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
13a50 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69        /* OUT: Fi
13a60 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  lename component
13a70 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61   of URI */.  cha
13a80 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13aa0 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
13ab0 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54  ge (if rc!=SQLIT
13ac0 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  E_OK) */.){.  in
13ad0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13ae0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
13af0 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73   flags = *pFlags
13b00 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
13b10 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56  zVfs = zDefaultV
13b20 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  fs;.  char *zFil
13b30 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  e;.  char c;.  i
13b40 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65  nt nUri = sqlite
13b50 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b  3Strlen30(zUri);
13b60 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ..  assert( *pzE
13b70 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69  rrMsg==0 );..  i
13b80 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  f( ((flags & SQL
13b90 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20  ITE_OPEN_URI)   
13ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
13bb0 3a 20 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20  : R-48725-32206 
13bc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  */.            |
13bd0 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
13be0 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20  onfig.bOpenUri) 
13bf0 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d  /* IMP: R-51689-
13c00 34 36 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e  46548 */.   && n
13c10 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
13c20 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
13c30 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  5)==0 /* IMP: R-
13c40 35 37 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20  57884-37496 */. 
13c50 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
13c60 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61  pt;.    int eSta
13c70 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
13c80 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
13c90 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69  state when parsi
13ca0 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e  ng URI */.    in
13cb0 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t iIn;          
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13cd0 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  nput character i
13ce0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
13cf0 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  iOut = 0;       
13d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
13d10 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
13d20 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
13d30 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20  Byte = nUri+2;  
13d40 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
13d50 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
13d60 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f  locate */..    /
13d70 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
13d80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
13d90 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69  flag is set to i
13da0 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56  ndicate to the V
13db0 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a  FS xOpen .    **
13dc0 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65   method that the
13dd0 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20  re may be extra 
13de0 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f  parameters follo
13df0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61  wing the file-na
13e00 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  me.  */.    flag
13e10 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
13e20 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69  _URI;..    for(i
13e30 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20  In=0; iIn<nUri; 
13e40 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20  iIn++) nByte += 
13e50 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29  (zUri[iIn]=='&')
13e60 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  ;.    zFile = sq
13e70 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
13e80 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  te);.    if( !zF
13e90 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
13ea0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20  ITE_NOMEM;..    
13eb0 69 49 6e 20 3d 20 35 3b 0a 23 69 66 6e 64 65 66  iIn = 5;.#ifndef
13ec0 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52   SQLITE_ALLOW_UR
13ed0 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20  I_AUTHORITY.    
13ee0 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
13ef0 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
13f00 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
13f10 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
13f20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
13f30 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
13f40 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
13f50 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
13f60 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
13f70 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
13f80 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  n++;.      if( i
13f90 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
13fa0 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
13fb0 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
13fc0 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
13fd0 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
13fe0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
13ff0 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
14000 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
14010 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
14020 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
14030 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14040 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
14050 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
14060 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
14070 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
14080 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d  Copy the filenam
14090 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20  e and any query 
140a0 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20  parameters into 
140b0 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72  the zFile buffer
140c0 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65  . .    ** Decode
140d0 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65   %HH escape code
140e0 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  s along the way.
140f0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
14100 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  Within this loop
14110 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74  , variable eStat
14120 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
14130 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e  0, 1 or 2, depen
14140 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ding.    ** on t
14150 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
14160 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  xt. As follows:.
14170 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
14180 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d  0: Parsing file-
14190 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31  name..    **   1
141a0 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73  : Parsing name s
141b0 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
141c0 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
141d0 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  ameter..    **  
141e0 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75   2: Parsing valu
141f0 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
14200 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
14210 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
14220 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30  /.    eState = 0
14230 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
14240 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
14250 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20  && c!='#' ){.   
14260 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
14270 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20  if( c=='%' .    
14280 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
14290 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29  digit(zUri[iIn])
142a0 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
142b0 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
142c0 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20  [iIn+1]) .      
142d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
142e0 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48  ctet = (sqlite3H
142f0 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
14300 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20  ++]) << 4);.    
14310 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c      octet += sql
14320 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
14330 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20  i[iIn++]);..    
14340 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65      assert( octe
14350 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35  t>=0 && octet<25
14360 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
14370 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20   octet==0 ){.   
14380 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
14390 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
143a0 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72  hen "%00" appear
143b0 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49  s within the URI
143c0 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20  . In this.      
143d0 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69      ** case we i
143e0 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69  gnore all text i
143f0 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
14400 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d  of the path, nam
14410 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  e or.          *
14420 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  * value currentl
14430 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20  y being parsed. 
14440 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75  So ignore the cu
14450 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a  rrent character.
14460 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
14470 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78   skip to the nex
14480 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26  t "?", "=" or "&
14490 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ", as appropriat
144a0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
144b0 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
144c0 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
144d0 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '#' .           
144e0 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30     && (eState!=0
144f0 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20   || c!='?').    
14500 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
14510 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27  tate!=1 || (c!='
14520 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20  =' && c!='&')). 
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
14540 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21  (eState!=2 || c!
14550 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='&').          
14560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
14570 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
14580 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
14590 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
145a0 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65          c = octe
145b0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
145c0 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20  f( eState==1 && 
145d0 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d  (c=='&' || c=='=
145e0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ') ){.        if
145f0 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d  ( zFile[iOut-1]=
14600 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14610 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69  /* An empty opti
14620 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20  on name. Ignore 
14630 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f  this option alto
14640 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gether. */.     
14650 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69       while( zUri
14660 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49  [iIn] && zUri[iI
14670 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b  n]!='#' && zUri[
14680 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49  iIn-1]!='&' ) iI
14690 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
146a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
146b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
146c0 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20  =='&' ){.       
146d0 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
146e0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
146f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14700 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20    eState = 2;.  
14710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14720 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 0;.      }el
14730 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d  se if( (eState==
14740 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20  0 && c=='?') || 
14750 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d  (eState==2 && c=
14760 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='&') ){.       
14770 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
14780 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  eState = 1;.    
14790 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b    }.      zFile[
147a0 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  iOut++] = c;.   
147b0 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74   }.    if( eStat
147c0 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75  e==1 ) zFile[iOu
147d0 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
147e0 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
147f0 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
14800 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
14810 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
14820 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79  f there were any
14830 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69   options specifi
14840 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ed that should b
14850 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20  e interpreted . 
14860 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69     ** here. Opti
14870 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74  ons that are int
14880 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e  erpreted here in
14890 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20  clude "vfs" and 
148a0 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a  those that.    *
148b0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  * correspond to 
148c0 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62  flags that may b
148d0 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
148e0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
148f0 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e  ).    ** method.
14900 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26   */.    zOpt = &
14910 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72  zFile[sqlite3Str
14920 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b  len30(zFile)+1];
14930 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74  .    while( zOpt
14940 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
14950 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53   nOpt = sqlite3S
14960 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20  trlen30(zOpt);. 
14970 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20       char *zVal 
14980 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b  = &zOpt[nOpt+1];
14990 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20  .      int nVal 
149a0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
149b0 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20  0(zVal);..      
149c0 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d  if( nOpt==3 && m
149d0 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70  emcmp("vfs", zOp
149e0 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 3)==0 ){.    
149f0 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b      zVfs = zVal;
14a00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14a10 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65        struct Ope
14a20 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20  nMode {.        
14a30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
14a40 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
14a50 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a  ode;.        } *
14a60 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  aMode = 0;.     
14a70 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79     char *zModeTy
14a80 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pe = 0;.        
14a90 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  int mask = 0;.  
14aa0 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20        int limit 
14ab0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  = 0;..        if
14ac0 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d  ( nOpt==5 && mem
14ad0 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70  cmp("cache", zOp
14ae0 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 5)==0 ){.    
14af0 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
14b00 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61  uct OpenMode aCa
14b10 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  cheMode[] = {.  
14b20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61            { "sha
14b30 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  red",  SQLITE_OP
14b40 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d  EN_SHAREDCACHE }
14b50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
14b60 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54  "private", SQLIT
14b70 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
14b80 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
14b90 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
14ba0 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
14bb0 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
14bc0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
14bd0 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  HE|SQLITE_OPEN_P
14be0 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20  RIVATECACHE;.   
14bf0 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
14c00 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20  CacheMode;.     
14c10 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73       limit = mas
14c20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  k;.          zMo
14c30 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22  deType = "cache"
14c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14c50 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20      if( nOpt==4 
14c60 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22  && memcmp("mode"
14c70 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b  , zOpt, 4)==0 ){
14c80 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
14c90 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
14ca0 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20  e aOpenMode[] = 
14cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
14cc0 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "ro",  SQLITE_OP
14cd0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20  EN_READONLY },. 
14ce0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
14cf0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
14d00 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20  READWRITE }, .  
14d10 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63            { "rwc
14d20 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ", SQLITE_OPEN_R
14d30 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
14d40 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c  E_OPEN_CREATE },
14d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
14d60 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f  memory", SQLITE_
14d70 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20  OPEN_MEMORY },. 
14d80 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
14d90 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
14da0 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
14db0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
14dc0 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45  EADONLY | SQLITE
14dd0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
14e00 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
14e10 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20  _OPEN_MEMORY;.  
14e20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
14e30 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20  aOpenMode;.     
14e40 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73       limit = mas
14e50 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  k & flags;.     
14e60 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
14e70 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20   "access";.     
14e80 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
14e90 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( aMode ){.     
14ea0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
14eb0 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d        int mode =
14ec0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
14ed0 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e  r(i=0; aMode[i].
14ee0 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; i++){.       
14ef0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
14f00 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  *z = aMode[i].z;
14f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
14f20 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74   nVal==sqlite3St
14f30 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d  rlen30(z) && 0==
14f40 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20  memcmp(zVal, z, 
14f50 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  nVal) ){.       
14f60 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d         mode = aM
14f70 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20  ode[i].mode;.   
14f80 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
14fa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14fb0 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d        if( mode==
14fc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14fd0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
14fe0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
14ff0 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25   such %s mode: %
15000 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a  s", zModeType, z
15010 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
15020 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15030 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
15040 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
15050 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
15060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
15070 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f  mode & ~SQLITE_O
15080 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69  PEN_MEMORY)>limi
15090 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
150a0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
150b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
150c0 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65   mode not allowe
150d0 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  d: %s",.        
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29  zModeType, zVal)
15110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
15120 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a   = SQLITE_PERM;.
15130 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
15140 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
15150 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15160 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66        flags = (f
15170 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20  lags & ~mask) | 
15180 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mode;.        }.
15190 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a        }..      z
151a0 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c  Opt = &zVal[nVal
151b0 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  +1];.    }..  }e
151c0 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  lse{.    zFile =
151d0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
151e0 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28  nUri+2);.    if(
151f0 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
15200 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15210 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
15220 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
15230 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
15240 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15250 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
15260 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
15270 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
15280 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
15290 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
152a0 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
152b0 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
152c0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
152d0 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
152e0 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
152f0 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
15300 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
15310 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
15320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15330 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
15340 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
15350 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
15360 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
15370 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
15380 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
15390 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
153a0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
153b0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
153c0 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
153d0 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
153e0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
153f0 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
15400 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
15410 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
15420 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
15430 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
15440 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
15450 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
15460 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
15470 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
15480 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
15490 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
154a0 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
154b0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
154c0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
154d0 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
154e0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f   int flags,    /
154f0 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
15500 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
15510 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
15520 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
15530 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
15540 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15560 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63    /* Store alloc
15570 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65  ated handle here
15580 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
155b0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
155c0 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20  Threadsafe;     
155d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
155e0 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65  e for threadsafe
155f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
15600 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20    char *zOpen = 
15610 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15620 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72    /* Filename ar
15630 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
15640 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f  o BtreeOpen() */
15650 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
15660 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15670 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
15680 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  age from sqlite3
15690 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23  ParseUri() */..#
156a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
156b0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
156c0 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
156d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
156e0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
156f0 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
15700 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15710 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
15720 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
15730 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
15740 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
15750 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61  dif..  /* Only a
15760 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
15770 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
15780 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
15790 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
157a0 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
157b0 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
157c0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
157d0 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
157e0 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
157f0 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
15800 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
15810 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
15820 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
15830 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
15840 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
15850 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
15860 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
15870 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
15880 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
15890 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
158a0 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
158b0 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
158c0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
158d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
158e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53    */.  assert( S
158f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
15900 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
15910 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
15920 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
15930 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
15940 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
15950 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
15960 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
15970 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
15980 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
15990 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
159a0 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
159b0 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
159c0 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
159d0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
159e0 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
159f0 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
15a00 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
15a10 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
15a20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20  & 0x46)==0 ){.  
15a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15a40 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a  MISUSE_BKPT;  /*
15a50 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34   IMP: R-65497-44
15a60 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66  594 */.  }..  if
15a70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
15a80 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
15a90 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
15aa0 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
15ab0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
15ac0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
15ad0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
15ae0 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
15af0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
15b00 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
15b10 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
15b20 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
15b30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
15b40 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
15b50 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15b60 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
15b70 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
15b80 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
15b90 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66  TECACHE ){.    f
15ba0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
15bb0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
15bc0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
15bd0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15be0 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
15bf0 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67  bled ){.    flag
15c00 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
15c10 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
15c20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68  }..  /* Remove h
15c30 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d  armful bits from
15c40 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
15c50 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  eter.  **.  ** T
15c60 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  he SQLITE_OPEN_N
15c70 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54  OMUTEX and SQLIT
15c80 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
15c90 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a   flags were.  **
15ca0 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74   dealt with in t
15cb0 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
15cc0 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73   block.  Besides
15cd0 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79   these, the only
15ce0 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75  .  ** valid inpu
15cf0 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  t flags for sqli
15d00 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72  te3_open_v2() ar
15d10 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
15d20 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c  ADONLY,.  ** SQL
15d30 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
15d40 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
15d50 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f  CREATE, SQLITE_O
15d60 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c  PEN_SHAREDCACHE,
15d70 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
15d80 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20  N_PRIVATECACHE, 
15d90 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65  and some reserve
15da0 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c  d bits.  Silentl
15db0 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20  y mask.  ** off 
15dc0 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e  all other flags.
15dd0 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d  .  */.  flags &=
15de0 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ~( SQLITE_OPEN
15df0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
15e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15e10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
15e20 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
15e30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
15e40 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20  EN_MAIN_DB |.   
15e50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15e60 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
15e70 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
15e80 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52    SQLITE_OPEN_TR
15e90 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20  ANSIENT_DB | .  
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15eb0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
15ec0 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
15ed0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
15ee0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
15ef0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
15f00 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
15f10 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  UBJOURNAL | .   
15f20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15f30 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
15f40 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20  OURNAL |.       
15f50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
15f60 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20  PEN_NOMUTEX |.  
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15f80 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
15f90 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
15fa0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
15fb0 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WAL.            
15fc0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
15fd0 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  te the sqlite da
15fe0 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
15ff0 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61    db = sqlite3Ma
16000 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
16010 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69  (sqlite3) );.  i
16020 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20  f( db==0 ) goto 
16030 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66  opendb_out;.  if
16040 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29  ( isThreadsafe )
16050 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20  {.    db->mutex 
16060 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
16070 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
16080 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
16090 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d   if( db->mutex==
160a0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
160b0 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20  e3_free(db);.   
160c0 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20     db = 0;.     
160d0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
160e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
160f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
16100 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
16110 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78  db->errMask = 0x
16120 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ff;.  db->nDb = 
16130 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
16140 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
16150 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
16160 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a  db->aDbStatic;..
16170 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16180 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
16190 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
161a0 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
161b0 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
161c0 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
161d0 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
161e0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
161f0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
16200 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  DS] = SQLITE_DEF
16210 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  AULT_WORKER_THRE
16220 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  ADS;.  db->autoC
16230 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
16240 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
16250 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  1;.  db->szMmap 
16260 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
16270 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
16280 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
16290 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78   = 0;.  db->nMax
162a0 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37  SorterMmap = 0x7
162b0 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66  FFFFFFF;.  db->f
162c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
162d0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
162e0 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
162f0 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63  ger | SQLITE_Cac
16300 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66  heSpill.#if !def
16310 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
16320 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
16330 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44  DEX) || SQLITE_D
16340 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
16350 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20  _INDEX.         
16360 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
16370 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69  _AutoIndex.#endi
16380 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
16390 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
163a0 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
163b0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
163c0 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
163d0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
163e0 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
163f0 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
16400 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
16410 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
16420 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
16430 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56  DEFAULT_RECURSIV
16440 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20  E_TRIGGERS.     
16450 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16460 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
16470 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
16480 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
16490 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29  LT_FOREIGN_KEYS)
164a0 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55   && SQLITE_DEFAU
164b0 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a  LT_FOREIGN_KEYS.
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164d0 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   | SQLITE_Foreig
164e0 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66  nKeys.#endif.#if
164f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
16500 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45  REVERSE_UNORDERE
16510 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20  D_SELECTS).     
16520 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16530 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
16540 72 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b  r.#endif.      ;
16550 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
16560 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  it(&db->aCollSeq
16570 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
16580 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
16590 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73  BLE.  sqlite3Has
165a0 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75  hInit(&db->aModu
165b0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  le);.#endif..  /
165c0 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c  * Add the defaul
165d0 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
165e0 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e  ence BINARY. BIN
165f0 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  ARY works for bo
16600 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e  th UTF-8.  ** an
16610 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64  d UTF-16, so add
16620 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65   a version for e
16630 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79  ach to avoid any
16640 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a   unnecessary.  *
16650 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54  * conversions. T
16660 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68  he only error th
16670 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72  at can occur her
16680 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20  e is a malloc() 
16690 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20  failure..  **.  
166a0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
166b0 52 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53 51  R-52786-44878 SQ
166c0 4c 69 74 65 20 64 65 66 69 6e 65 73 20 74 68 72  Lite defines thr
166d0 65 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  ee built-in coll
166e0 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74  ating.  ** funct
166f0 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65  ions:.  */.  cre
16700 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
16710 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
16720 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f  E_UTF8, 0, binCo
16730 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
16740 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
16750 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
16760 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62  TE_UTF16BE, 0, b
16770 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
16780 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
16790 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
167a0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
167b0 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
167c0 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
167d0 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53  ation(db, "NOCAS
167e0 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  E", SQLITE_UTF8,
167f0 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74   0, nocaseCollat
16800 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ingFunc, 0);.  c
16810 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
16820 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
16830 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
16840 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  1, binCollFunc, 
16850 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
16860 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
16870 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
16880 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44  t;.  }.  /* EVID
16890 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38  ENCE-OF: R-08308
168a0 2d 31 37 32 32 34 20 54 68 65 20 64 65 66 61 75  -17224 The defau
168b0 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  lt collating fun
168c0 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20  ction for all.  
168d0 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42 49  ** strings is BI
168e0 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62  NARY. .  */.  db
168f0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71  ->pDfltColl = sq
16900 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
16910 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
16920 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a  , "BINARY", 0);.
16930 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44    assert( db->pD
16940 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20  fltColl!=0 );.. 
16950 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69   /* Parse the fi
16960 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d  lename/URI argum
16970 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  ent. */.  db->op
16980 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
16990 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
169a0 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46  arseUri(zVfs, zF
169b0 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c  ilename, &flags,
169c0 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70   &db->pVfs, &zOp
169d0 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  en, &zErrMsg);. 
169e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
169f0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
16a00 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
16a10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
16a20 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d = 1;.    sqlit
16a30 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
16a40 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f  b, rc, zErrMsg ?
16a50 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d   "%s" : 0, zErrM
16a60 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
16a70 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
16a80 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
16a90 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  out;.  }..  /* O
16aa0 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20  pen the backend 
16ab0 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20  database driver 
16ac0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
16ad0 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
16ae0 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20  Vfs, zOpen, db, 
16af0 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  &db->aDb[0].pBt,
16b00 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
16b10 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67              flag
16b20 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s | SQLITE_OPEN_
16b30 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20  MAIN_DB);.  if( 
16b40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16b50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16b60 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
16b70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16b80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16b90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
16ba0 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20  or(db, rc);.    
16bb0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
16bc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
16bd0 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62  reeEnter(db->aDb
16be0 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
16bf0 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
16c00 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
16c10 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
16c20 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62  .pBt);.  if( !db
16c30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
16c40 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d   ENC(db) = SCHEM
16c50 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c  A_ENC(db);.  sql
16c60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64  ite3BtreeLeave(d
16c70 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
16c80 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63    db->aDb[1].pSc
16c90 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
16ca0 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a  hemaGet(db, 0);.
16cb0 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
16cc0 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  t safety_level f
16cd0 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
16ce0 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20  base is 'full'; 
16cf0 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a  for the temp.  *
16d00 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73  * database it is
16d10 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61   'NONE'. This ma
16d20 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
16d30 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20  layer defaults. 
16d40 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62   .  */.  db->aDb
16d50 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69  [0].zName = "mai
16d60 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  n";.  db->aDb[0]
16d70 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
16d80 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  3;.  db->aDb[1].
16d90 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a  zName = "temp";.
16da0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66    db->aDb[1].saf
16db0 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a  ety_level = 1;..
16dc0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
16dd0 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
16de0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
16df0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
16e00 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
16e10 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
16e20 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20  er all built-in 
16e30 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64  functions, but d
16e40 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
16e50 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64   read the.  ** d
16e60 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79  atabase schema y
16e70 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61  et. This is dela
16e80 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  yed until the fi
16e90 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  rst time the dat
16ea0 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63  abase.  ** is ac
16eb0 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  cessed..  */.  s
16ec0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
16ed0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
16ee0 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69  lite3RegisterBui
16ef0 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
16f00 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75  );..  /* Load au
16f10 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f  tomatic extensio
16f20 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20  ns - extensions 
16f30 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72  that have been r
16f40 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75  egistered.  ** u
16f50 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
16f60 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e  _automatic_exten
16f70 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f  sion() API..  */
16f80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
16f90 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69  errcode(db);.  i
16fa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16fb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   ){.    sqlite3A
16fc0 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  utoLoadExtension
16fd0 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  s(db);.    rc = 
16fe0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
16ff0 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  db);.    if( rc!
17000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17010 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
17020 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
17030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17040 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20  ABLE_FTS1.  if( 
17050 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17060 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  d ){.    extern 
17070 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49  int sqlite3Fts1I
17080 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
17090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
170a0 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts1Init(db);.  }
170b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
170c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
170d0 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S2.  if( !db->ma
170e0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
170f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17100 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
17110 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71  lite3Fts2Init(sq
17120 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
17130 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  = sqlite3Fts2Ini
17140 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
17150 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
17160 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69  _ENABLE_FTS3.  i
17170 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
17180 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
17190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
171a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  = sqlite3Fts3Ini
171b0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
171c0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
171d0 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66  _ENABLE_ICU.  if
171e0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
171f0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
17200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
17210 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28   sqlite3IcuInit(
17220 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
17230 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17240 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66  NABLE_RTREE.  if
17250 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
17260 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
17270 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
17280 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74  sqlite3RtreeInit
17290 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
172a0 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f  ..  /* -DSQLITE_
172b0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
172c0 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43  MODE=1 makes EXC
172d0 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75  LUSIVE the defau
172e0 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
172f0 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f  mode.  -DSQLITE_
17300 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
17310 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d  MODE=0 make NORM
17320 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  AL the default l
17330 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
17340 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67  .  Doing nothing
17350 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b   at all also mak
17360 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  es NORMAL the de
17370 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64  fault..  */.#ifd
17380 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
17390 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20  T_LOCKING_MODE. 
173a0 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64   db->dfltLockMod
173b0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
173c0 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b  LT_LOCKING_MODE;
173d0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  .  sqlite3PagerL
173e0 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74  ockingMode(sqlit
173f0 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
17400 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20  >aDb[0].pBt),.  
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
17430 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
17440 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ODE);.#endif..  
17450 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33  if( rc ) sqlite3
17460 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a  Error(db, rc);..
17470 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
17480 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
17490 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
174a0 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
174b0 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
174c0 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
174d0 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
174f0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17500 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
17510 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  .  sqlite3_wal_a
17520 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
17530 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
17540 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
17550 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75  INT);..opendb_ou
17560 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
17570 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20  e(zOpen);.  if( 
17580 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  db ){.    assert
17590 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c  ( db->mutex!=0 |
175a0 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  | isThreadsafe==
175b0 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  0 || sqlite3Glob
175c0 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
175d0 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
175e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
175f0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
17600 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
17610 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
17620 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c  assert( db!=0 ||
17630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
17640 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  M );.  if( rc==S
17650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
17660 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
17670 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
17680 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
17690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
176a0 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
176b0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
176c0 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20  ;.  }.  *ppDb = 
176d0 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  db;.#ifdef SQLIT
176e0 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
176f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
17700 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
17710 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  g ){.    /* Open
17720 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e  ing a db handle.
17730 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
17740 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a  r is passed 0. *
17750 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67  /.    void *pArg
17760 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
17770 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
17780 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  g;.    sqlite3Gl
17790 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
177a0 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69  og(pArg, db, zFi
177b0 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  lename, 0);.  }.
177c0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
177d0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
177e0 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
177f0 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
17800 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
17810 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
17820 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17830 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
17840 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
17850 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
17860 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
17870 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
17880 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17890 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
178a0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
178b0 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
178c0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
178d0 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
178e0 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
178f0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
17900 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
17910 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
17920 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
17930 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
17940 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17960 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
17970 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
17980 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
17990 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
179a0 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
179b0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
179c0 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e  ename, ppDb, (un
179d0 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73  signed int)flags
179e0 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
179f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17a00 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
17a10 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
17a20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
17a30 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
17a40 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
17a50 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
17a60 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
17a70 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
17a80 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
17a90 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
17aa0 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
17ab0 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
17ac0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
17ad0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  l;.  int rc;..#i
17ae0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17af0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
17b00 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74  f( ppDb==0 ) ret
17b10 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
17b20 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
17b30 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
17b40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17b50 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
17b60 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
17b70 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
17b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
17b90 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  if.  if( zFilena
17ba0 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d  me==0 ) zFilenam
17bb0 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a  e = "\000\000";.
17bc0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
17bd0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
17be0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
17bf0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c  r(pVal, -1, zFil
17c00 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  ename, SQLITE_UT
17c10 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54  F16NATIVE, SQLIT
17c20 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69  E_STATIC);.  zFi
17c30 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65  lename8 = sqlite
17c40 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
17c50 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
17c60 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20   if( zFilename8 
17c70 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
17c80 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
17c90 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  me8, ppDb,.     
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17cc0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
17cd0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
17ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
17cf0 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  Db || rc==SQLITE
17d00 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
17d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17d20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
17d30 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53  y(*ppDb, 0, DB_S
17d40 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
17d50 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43        SCHEMA_ENC
17d60 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70  (*ppDb) = ENC(*p
17d70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
17d80 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
17d90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
17da0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
17db0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
17dc0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
17dd0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
17de0 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
17df0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
17e00 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
17e10 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
17e20 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
17e30 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
17e40 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
17e50 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
17e60 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
17e70 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
17e80 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
17e90 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
17ea0 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
17eb0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
17ec0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
17ed0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
17ee0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
17ef0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
17f00 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
17f10 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d  tion_v2(db, zNam
17f20 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  e, enc, pCtx, xC
17f30 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f  ompare, 0);.}../
17f40 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
17f50 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
17f60 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
17f70 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
17f80 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
17f90 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
17fa0 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
17fb0 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
17fc0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
17fd0 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
17fe0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
17ff0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
18000 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
18010 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
18020 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
18030 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
18040 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
18050 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
18060 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
18070 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
18080 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
18090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
180a0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
180b0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
180c0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
180d0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
180e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
180f0 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
18100 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
18110 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70  Name, (u8)enc, p
18120 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78  Ctx, xCompare, x
18130 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Del);.  rc = sql
18140 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
18150 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
18160 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
18170 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
18180 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
18190 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
181a0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
181b0 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
181c0 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
181d0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
181e0 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
181f0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
18200 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ation16(.  sqlit
18210 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
18220 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20   void *zName,.  
18230 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
18240 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
18250 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
18260 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
18270 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
18280 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18290 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
182a0 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66  *zName8;..#ifdef
182b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
182c0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
182d0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
182e0 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d  ckOk(db) || zNam
182f0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
18300 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
18310 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
18320 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
18330 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
18340 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
18350 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d  Failed );.  zNam
18360 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  e8 = sqlite3Utf1
18370 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  6to8(db, zName, 
18380 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
18390 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a  NATIVE);.  if( z
183a0 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  Name8 ){.    rc 
183b0 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
183c0 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75  n(db, zName8, (u
183d0 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
183e0 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
183f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18400 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20   zName8);.  }.  
18410 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
18420 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
18430 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
18440 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
18450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
18460 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
18470 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
18480 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
18490 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
184a0 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
184b0 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
184c0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
184d0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
184e0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
184f0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
18500 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
18510 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
18520 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
18530 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
18540 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
18550 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
18560 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
18570 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
18580 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
18590 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65   char*).){.#ifde
185a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
185b0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
185c0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
185d0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
185e0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
185f0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
18600 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18610 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
18620 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
18630 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b  d = xCollNeeded;
18640 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
18650 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  ed16 = 0;.  db->
18660 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
18670 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
18680 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18690 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
186a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
186b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
186c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
186d0 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
186e0 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
186f0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
18700 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
18710 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
18720 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
18730 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
18740 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
18750 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
18760 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
18770 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
18780 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74  eeded16(.  sqlit
18790 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
187a0 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
187b0 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
187c0 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73  eeded16)(void*,s
187d0 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
187e0 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  tRep,const void*
187f0 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
18800 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
18810 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
18820 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
18830 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
18840 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
18850 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18860 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
18870 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
18880 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
18890 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
188a0 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
188b0 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
188c0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
188d0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
188e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
188f0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
18900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18910 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
18920 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
18930 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
18940 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
18950 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  TED./*.** This f
18960 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61  unction is now a
18970 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49  n anachronism. I
18980 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65  t used to be use
18990 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  d to recover fro
189a0 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  m a.** malloc() 
189b0 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c  failure, but SQL
189c0 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69  ite now does thi
189d0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  s automatically.
189e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
189f0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76  global_recover(v
18a00 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  oid){.  return S
18a10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
18a20 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  if../*.** Test t
18a30 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
18a40 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
18a50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
18a60 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a  in autocommit.**
18a70 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54   mode.  Return T
18a80 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64  RUE if it is and
18a90 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20   FALSE if not.  
18aa0 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  Autocommit mode 
18ab0 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61  is on.** by defa
18ac0 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  ult.  Autocommit
18ad0 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20   is disabled by 
18ae0 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
18af0 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a  t and reenabled.
18b00 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43  ** by the next C
18b10 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
18b20 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
18b30 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
18b40 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
18b50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18b60 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
18b70 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
18b80 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
18b90 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
18ba0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
18bb0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
18bc0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
18bd0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b   db->autoCommit;
18be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
18bf0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
18c00 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65 73   are substitutes
18c10 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53   for constants S
18c20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a  QLITE_CORRUPT,.*
18c30 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  * SQLITE_MISUSE,
18c40 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
18c50 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61  , SQLITE_IOERR a
18c60 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65  nd possibly othe
18c70 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74  r error.** const
18c80 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76  ants.  They serv
18c90 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a  e two purposes:.
18ca0 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76  **.**   1.  Serv
18cb0 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  e as a convenien
18cc0 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
18cd0 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61   breakpoint in a
18ce0 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20   debugger.**    
18cf0 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65     to detect whe
18d00 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20  n version error 
18d10 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72  conditions occur
18d20 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49  s..**.**   2.  I
18d30 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f  nvoke sqlite3_lo
18d40 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74  g() to provide t
18d50 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c  he source code l
18d60 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  ocation where.**
18d70 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76         a low-lev
18d80 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73  el error is firs
18d90 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69  t detected..*/.i
18da0 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
18db0 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
18dc0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
18dd0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18de0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
18df0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
18e00 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20  ITE_CORRUPT,.   
18e10 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74 61             "data
18e20 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
18e30 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
18e40 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
18e50 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
18e60 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
18e70 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
18e80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d  QLITE_CORRUPT;.}
18e90 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75  .int sqlite3Misu
18ea0 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  seError(int line
18eb0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
18ec0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18ed0 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
18ee0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
18ef0 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20  LITE_MISUSE, .  
18f00 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 69 73              "mis
18f10 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f  use at line %d o
18f20 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20  f [%.10s]",.    
18f30 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f            lineno
18f40 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
18f50 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
18f60 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
18f70 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ;.}.int sqlite3C
18f80 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74  antopenError(int
18f90 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
18fa0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
18fb0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
18fc0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
18fd0 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  og(SQLITE_CANTOP
18fe0 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  EN, .           
18ff0 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20     "cannot open 
19000 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20  file at line %d 
19010 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
19020 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
19030 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
19040 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
19050 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
19060 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  PEN;.}...#ifndef
19070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
19080 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
19090 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  is is a convenie
190a0 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74  nce routine that
190b0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
190c0 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63   all thread-spec
190d0 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72  ific.** data for
190e0 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
190f0 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
19100 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  d..**.** SQLite 
19110 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74  no longer uses t
19120 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64  hread-specific d
19130 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ata so this rout
19140 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20  ine is now a.** 
19150 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65  no-op.  It is re
19160 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f  tained for histo
19170 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
19180 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
19190 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
191a0 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e  nup(void){.}.#en
191b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
191c0 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
191d0 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
191e0 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
191f0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
19200 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
19210 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
19220 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
19230 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tails..*/.int sq
19240 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
19250 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
19260 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
19270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
19280 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
19290 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
192a0 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
192b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
192c0 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
192d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
192e0 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
192f0 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
19300 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
19310 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
19320 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
19330 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
19340 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
19350 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
19360 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
19370 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
19380 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
19390 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
193a0 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
193b0 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
193d0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
193e0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
193f0 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
19400 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
19410 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
19420 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
19430 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
19440 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
19450 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
19460 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
19470 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
19480 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
19490 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
194a0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
194b0 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
194c0 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
194d0 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
194e0 69 43 6f 6c 20 3d 20 30 3b 0a 0a 20 20 63 68 61  iCol = 0;..  cha
194f0 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79  r const *zDataTy
19500 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
19510 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d  onst *zCollSeq =
19520 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c   0;.  int notnul
19530 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69  l = 0;.  int pri
19540 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69  marykey = 0;.  i
19550 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a  nt autoinc = 0;.
19560 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65  .  /* Ensure the
19570 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
19580 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64   has been loaded
19590 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
195a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
195b0 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
195c0 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
195d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
195e0 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
195f0 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  g);.  if( SQLITE
19600 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67  _OK!=rc ){.    g
19610 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
19620 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
19630 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65  the table in que
19640 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20  stion */.  pTab 
19650 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
19660 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d  le(db, zTableNam
19670 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  e, zDbName);.  i
19680 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
19690 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
196a0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
196b0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
196c0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
196d0 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
196e0 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
196f0 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43  sted */.  if( zC
19700 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a  olumnName==0 ){.
19710 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72      /* Query for
19720 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61   existance of ta
19730 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65  ble only */.  }e
19740 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
19750 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
19760 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
19770 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
19780 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
19790 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
197a0 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
197b0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
197c0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
197d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
197e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
197f0 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
19800 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
19810 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c  wid(pTab) && sql
19820 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
19830 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
19840 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
19850 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
19860 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  pCol = iCol>=0 ?
19870 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
19880 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65  l] : 0;.      }e
19890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
198a0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  b = 0;.        g
198b0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
198c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
198d0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
198e0 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
198f0 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
19900 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
19910 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
19920 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
19930 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
19940 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
19950 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
19960 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
19970 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
19980 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
19990 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
199a0 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
199b0 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
199c0 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
199d0 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
199e0 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
199f0 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
19a00 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
19a10 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
19a20 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
19a30 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
19a40 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
19a50 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
19a60 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
19a70 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
19a80 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
19a90 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
19aa0 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
19ab0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
19ac0 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
19ad0 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
19ae0 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c  zDataType = pCol
19af0 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f  ->zType;.    zCo
19b00 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
19b10 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
19b20 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
19b30 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
19b40 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f  key  = (pCol->co
19b50 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
19b60 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20  _PRIMKEY)!=0;.  
19b70 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
19b80 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
19b90 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
19ba0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
19bb0 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
19bc0 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
19bd0 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
19be0 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
19bf0 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
19c00 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
19c10 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b  lSeq = "BINARY";
19c20 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
19c30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19c40 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
19c50 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66  /* Whether the f
19c60 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63  unction call suc
19c70 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64  ceeded or failed
19c80 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  , set the output
19c90 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a   parameters.  **
19ca0 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65   to whatever the
19cb0 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72  ir local counter
19cc0 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49  parts contain. I
19cd0 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f  f an error did o
19ce0 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20  ccur,.  ** this 
19cf0 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
19d00 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75  f zeroing all ou
19d10 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
19d20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61  .  */.  if( pzDa
19d30 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61  taType ) *pzData
19d40 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65  Type = zDataType
19d50 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65  ;.  if( pzCollSe
19d60 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d  q ) *pzCollSeq =
19d70 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28   zCollSeq;.  if(
19d80 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f   pNotNull ) *pNo
19d90 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b  tNull = notnull;
19da0 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b  .  if( pPrimaryK
19db0 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65  ey ) *pPrimaryKe
19dc0 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  y = primarykey;.
19dd0 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29    if( pAutoinc )
19de0 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74   *pAutoinc = aut
19df0 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c  oinc;..  if( SQL
19e00 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70  ITE_OK==rc && !p
19e10 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
19e20 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
19e30 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d  rMsg);.    zErrM
19e40 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
19e50 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68  ntf(db, "no such
19e60 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25   table column: %
19e70 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d  s.%s", zTableNam
19e80 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  e,.        zColu
19e90 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  mnName);.    rc 
19ea0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
19eb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
19ec0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
19ed0 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
19ee0 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
19ef0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19f00 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
19f10 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
19f20 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
19f30 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
19f40 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
19f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19f60 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
19f70 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
19f80 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
19f90 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
19fa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c  /.int sqlite3_sl
19fb0 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73  eep(int ms){.  s
19fc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
19fd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56  ;.  int rc;.  pV
19fe0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
19ff0 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
1a000 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVfs==0 ) return
1a010 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
1a020 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e  unction works in
1a030 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62   milliseconds, b
1a040 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ut the underlyin
1a050 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a  g OsSleep() .  *
1a060 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f  * API uses micro
1a070 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74  seconds. Hence t
1a080 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a  he 1000's..  */.
1a090 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f    rc = (sqlite3O
1a0a0 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30  sSleep(pVfs, 100
1a0b0 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72  0*ms)/1000);.  r
1a0c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a0d0 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1a0e0 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65  able the extende
1a0f0 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a  d result codes..
1a100 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
1a110 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
1a120 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  odes(sqlite3 *db
1a130 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69  , int onoff){.#i
1a140 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a150 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1a160 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1a170 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1a180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1a190 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1a1a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a1b0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1a1c0 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
1a1d0 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66   = onoff ? 0xfff
1a1e0 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20  fffff : 0xff;.  
1a1f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a200 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1a210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a220 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  OK;.}../*.** Inv
1a230 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e  oke the xFileCon
1a240 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61  trol method on a
1a250 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1a260 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1a270 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1a280 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
1a290 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1a2a0 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  me, int op, void
1a2b0 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
1a2c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1a2d0 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  ;.  Btree *pBtre
1a2e0 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
1a2f0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1a300 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1a310 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1a320 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1a330 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1a340 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1a350 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1a360 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65  >mutex);.  pBtre
1a370 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  e = sqlite3DbNam
1a380 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1a390 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74  Name);.  if( pBt
1a3a0 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ree ){.    Pager
1a3b0 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71   *pPager;.    sq
1a3c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
1a3d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a3e0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1a3f0 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
1a400 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
1a410 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
1a420 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1a430 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33      fd = sqlite3
1a440 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
1a450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
1a460 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
1a470 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1a480 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b  _FILE_POINTER ){
1a490 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1a4a0 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66  _file**)pArg = f
1a4b0 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  d;.      rc = SQ
1a4c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1a4d0 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  se if( fd->pMeth
1a4e0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ods ){.      rc 
1a4f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
1a500 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
1a510 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Arg);.    }else{
1a520 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a530 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20  TE_NOTFOUND;.   
1a540 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1a550 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1a560 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1a570 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1a580 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1a590 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a   rc;   .}../*.**
1a5a0 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   Interface to th
1a5b0 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e  e testing logic.
1a5c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a5d0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
1a5e0 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74   op, ...){.  int
1a5f0 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66   rc = 0;.#ifndef
1a600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
1a610 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c  LTIN_TEST.  va_l
1a620 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1a630 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
1a640 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
1a650 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
1a660 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1a670 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
1a680 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a690 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1a6a0 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
1a6b0 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
1a6c0 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
1a6d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1a6e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
1a6f0 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
1a700 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
1a710 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
1a720 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
1a730 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
1a740 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
1a750 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
1a760 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
1a770 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
1a780 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
1a790 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a7a0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1a7b0 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
1a7c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1a7d0 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
1a7e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a7f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1a800 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
1a810 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
1a820 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
1a830 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
1a840 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
1a850 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1a860 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
1a870 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
1a880 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
1a890 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
1a8a0 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
1a8b0 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
1a8c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1a8d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1a8e0 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
1a8f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
1a900 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
1a910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a920 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1a930 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1a940 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
1a950 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
1a960 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1a970 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
1a980 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
1a990 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
1a9a0 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
1a9b0 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
1a9c0 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
1a9d0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
1a9e0 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
1a9f0 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
1aa00 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1aa10 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
1aa20 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
1aa30 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
1aa40 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
1aa50 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1aa60 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
1aa70 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1aa80 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1aa90 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1aaa0 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
1aab0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
1aac0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1aad0 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
1aae0 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
1aaf0 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
1ab00 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
1ab10 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
1ab20 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
1ab30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ab40 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1ab50 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1ab60 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c  l(FAULT_INSTALL,
1ab70 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20   xCallback).    
1ab80 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67  **.    ** Arrang
1ab90 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c  e to invoke xCal
1aba0 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72  lback() whenever
1abb0 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1abc0 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
1abd0 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63    ** if xCallbac
1abe0 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  k is not NULL.. 
1abf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20     **.    ** As 
1ac00 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61  a test of the fa
1ac10 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65  ult simulator me
1ac20 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20  chanism itself, 
1ac30 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1ac40 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c  0).    ** is cal
1ac50 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  led immediately 
1ac60 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67  after installing
1ac70 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63   the new callbac
1ac80 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  k and the return
1ac90 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72  .    ** value fr
1aca0 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  om sqlite3FaultS
1acb0 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68  im(0) becomes th
1acc0 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20  e return from.  
1acd0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
1ace0 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20  t_control()..   
1acf0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ad00 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
1ad10 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20  LT_INSTALL: {.  
1ad20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
1ad30 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
1ad40 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
1ad50 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
1ad60 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
1ad70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
1ad80 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
1ad90 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
1ada0 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c  lConfig.xTestCal
1adb0 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61  lback = va_arg(a
1adc0 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b  p, int(*)(int));
1add0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ade0 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53  typedef int(*TES
1adf0 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1ae00 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (int);.      sql
1ae10 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ae20 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1ae30 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54   va_arg(ap, TEST
1ae40 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b  CALLBACKFUNC_t);
1ae50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ae60 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a  te3FaultSim(0);.
1ae70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ae80 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1ae90 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1aea0 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
1aeb0 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
1aec0 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
1aed0 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
1aee0 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
1aef0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
1af00 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
1af10 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
1af20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
1af30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1af40 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
1af50 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
1af60 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1af70 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
1af80 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
1af90 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1afa0 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
1afb0 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
1afc0 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
1afd0 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
1afe0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1aff0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
1b000 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
1b010 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1b020 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1b030 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
1b040 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
1b050 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
1b060 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
1b070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1b080 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1b090 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1b0a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1b0b0 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
1b0c0 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
1b0d0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1b0e0 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
1b0f0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
1b100 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
1b110 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
1b120 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
1b130 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
1b140 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
1b150 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
1b160 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
1b170 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1b180 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
1b190 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
1b1a0 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
1b1b0 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
1b1c0 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
1b1d0 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
1b1e0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
1b1f0 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
1b200 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
1b210 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1b220 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
1b230 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
1b240 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
1b250 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
1b260 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
1b270 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62  ** deleterious b
1b280 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
1b290 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b2a0 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1b2b0 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
1b2c0 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
1b2d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1b2e0 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
1b2f0 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
1b300 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
1b310 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
1b320 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
1b330 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
1b340 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
1b350 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
1b360 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1b370 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1b380 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1b390 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1b3a0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1b3b0 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
1b3c0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1b3d0 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1b3e0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1b3f0 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
1b400 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
1b410 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
1b420 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1b430 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
1b440 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
1b450 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
1b460 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1b470 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1b480 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
1b490 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
1b4a0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1b4b0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1b4c0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1b4d0 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
1b4e0 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
1b4f0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1b500 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
1b510 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
1b520 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
1b530 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
1b540 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
1b550 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1b560 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
1b570 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1b580 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
1b590 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b5a0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
1b5b0 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
1b5c0 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
1b5d0 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
1b5e0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1b5f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1b600 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1b610 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1b620 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1b630 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1b640 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1b650 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1b660 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1b670 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1b680 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1b690 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1b6a0 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1b6b0 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1b6c0 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1b6d0 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1b6e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1b6f0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1b700 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
1b710 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
1b720 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
1b730 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
1b740 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
1b750 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
1b760 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
1b770 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
1b780 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1b790 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
1b7a0 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
1b7b0 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
1b7c0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1b7d0 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
1b7e0 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
1b7f0 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
1b800 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
1b810 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
1b820 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
1b830 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1b840 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
1b850 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
1b860 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
1b870 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1b880 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1b890 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1b8a0 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
1b8b0 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
1b8c0 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
1b8d0 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
1b8e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1b8f0 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
1b900 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
1b910 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1b920 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1b930 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1b940 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
1b950 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1b960 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
1b970 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
1b980 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
1b990 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1b9a0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
1b9b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1b9c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1b9d0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
1b9e0 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
1b9f0 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
1ba00 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
1ba10 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1ba20 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
1ba30 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1ba40 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ba50 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1ba60 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
1ba70 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1ba80 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
1ba90 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
1baa0 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
1bab0 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
1bac0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
1bad0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1bae0 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
1baf0 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
1bb00 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1bb10 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
1bb20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1bb30 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1bb40 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
1bb50 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1bb60 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
1bb70 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
1bb80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bb90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1bba0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1bbb0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1bbc0 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29  TCTRL_BYTEORDER)
1bbd0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1bbe0 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75  The integer retu
1bbf0 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65  rned reveals the
1bc00 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74   byte-order of t
1bc10 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77  he computer on w
1bc20 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69  hich.    ** SQLi
1bc30 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20  te is running:. 
1bc40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1bc50 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64     1     big-end
1bc60 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
1bc70 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1bc80 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20     **      10   
1bc90 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1bca0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1bcb0 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1bcc0 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65  432101     big-e
1bcd0 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d  ndian,    determ
1bce0 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1bcf0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33  time.    **  123
1bd00 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65  410     little-e
1bd10 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1bd20 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1bd30 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61  e.    */ .    ca
1bd40 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1bd50 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a  RL_BYTEORDER: {.
1bd60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bd70 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20  E_BYTEORDER*100 
1bd80 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45  + SQLITE_LITTLEE
1bd90 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54  NDIAN*10 + SQLIT
1bda0 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20  E_BIGENDIAN;.   
1bdb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bdc0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1bdd0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1bde0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1bdf0 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
1be00 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1be10 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1be20 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
1be30 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
1be40 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
1be50 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1be60 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1be70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1be80 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1be90 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
1bea0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1beb0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1bec0 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
1bed0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1bee0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1bef0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1bf00 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1bf10 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1bf20 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
1bf30 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
1bf40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1bf50 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1bf60 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
1bf70 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1bf80 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
1bf90 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1bfa0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1bfb0 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
1bfc0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1bfd0 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
1bfe0 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
1bff0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1c000 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
1c010 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
1c020 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
1c030 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
1c040 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
1c050 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
1c060 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
1c070 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
1c080 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
1c090 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
1c0a0 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
1c0b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
1c0c0 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
1c0d0 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
1c0e0 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
1c0f0 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
1c100 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
1c110 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1c120 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
1c130 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1c140 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
1c150 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
1c160 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
1c170 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1c180 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1c190 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
1c1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1c1b0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1c1c0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1c1d0 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
1c1e0 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
1c1f0 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
1c200 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c210 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1c220 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
1c230 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
1c240 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1c250 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
1c260 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
1c270 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
1c280 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
1c290 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
1c2a0 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
1c2b0 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
1c2c0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
1c2d0 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
1c2e0 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
1c2f0 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
1c300 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
1c310 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
1c320 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
1c330 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
1c340 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
1c350 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
1c360 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
1c370 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
1c380 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1c390 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
1c3a0 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
1c3b0 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
1c3c0 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
1c3d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1c3e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
1c3f0 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
1c400 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
1c410 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
1c420 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
1c430 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
1c440 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
1c450 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
1c460 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
1c470 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
1c480 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
1c490 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
1c4a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c4b0 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
1c4c0 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
1c4d0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1c4e0 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
1c4f0 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
1c500 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
1c510 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
1c520 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
1c530 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
1c540 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
1c550 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
1c560 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
1c570 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
1c580 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c590 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
1c5a0 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
1c5b0 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
1c5c0 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
1c5d0 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
1c5e0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1c5f0 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
1c600 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
1c610 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
1c620 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1c630 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
1c640 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
1c650 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
1c660 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
1c670 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
1c680 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
1c690 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1c6a0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1c6b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1c6c0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1c6d0 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
1c6e0 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
1c6f0 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
1c700 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
1c710 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
1c720 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
1c730 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
1c740 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1c750 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
1c760 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
1c770 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
1c780 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
1c790 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
1c7a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c7b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1c7c0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
1c7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1c7e0 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
1c7f0 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
1c800 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1c810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c820 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1c830 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1c840 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1c850 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
1c860 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
1c870 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
1c880 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
1c890 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
1c8a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
1c8b0 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
1c8c0 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
1c8d0 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
1c8e0 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
1c8f0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
1c900 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
1c910 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1c920 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
1c930 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
1c940 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
1c950 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
1c960 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
1c970 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
1c980 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
1c990 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
1c9a0 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
1c9b0 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
1c9c0 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
1c9d0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
1c9e0 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
1c9f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ca00 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1ca10 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
1ca20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1ca30 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
1ca40 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
1ca50 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1ca60 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1ca70 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1ca80 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1ca90 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1caa0 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61  OVERAGE, xCallba
1cab0 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a  ck, ptr);.    **
1cac0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1cad0 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61  VDBE coverage ca
1cae0 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
1caf0 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74  to xCallback wit
1cb00 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  h context .    *
1cb10 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20  * pointer ptr.. 
1cb20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1cb30 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56  QLITE_TESTCTRL_V
1cb40 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a  DBE_COVERAGE: {.
1cb50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
1cb60 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
1cb70 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
1cb80 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  *branch_callback
1cb90 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75  )(void*,int,u8,u
1cba0 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
1cbb0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56  3GlobalConfig.xV
1cbc0 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61  dbeBranch = va_a
1cbd0 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c  rg(ap,branch_cal
1cbe0 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71  lback);.      sq
1cbf0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1cc00 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67  g.pVdbeBranchArg
1cc10 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69   = va_arg(ap,voi
1cc20 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  d*);.#endif.    
1cc30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cc40 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1cc50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1cc60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
1cc70 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e  RTER_MMAP, db, n
1cc80 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73  Max); */.    cas
1cc90 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1cca0 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b  L_SORTER_MMAP: {
1ccb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1ccc0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1ccd0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1cce0 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d   db->nMaxSorterM
1ccf0 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  map = va_arg(ap,
1cd00 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1cd10 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1cd20 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1cd30 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1cd40 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29  TESTCTRL_ISINIT)
1cd50 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1cd60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1cd70 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62   if SQLite has b
1cd80 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
1cd90 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  and SQLITE_ERROR
1cda0 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a   if.    ** not..
1cdb0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1cdc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cdd0 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20  ISINIT: {.      
1cde0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1cdf0 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d  lConfig.isInit==
1ce00 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
1ce10 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1ce20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1ce30 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64  va_end(ap);.#end
1ce40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1ce50 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a  T_BUILTIN_TEST *
1ce60 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1ce70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
1ce80 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  a utility routin
1ce90 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53  e, useful to VFS
1cea0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1ceb0 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a  , that checks.**
1cec0 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74   to see if a dat
1ced0 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61  abase file was a
1cee0 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69   URI that contai
1cef0 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71  ned a specific q
1cf00 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74  uery .** paramet
1cf10 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62  er, and if so ob
1cf20 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
1cf30 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72  of the query par
1cf40 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
1cf50 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
1cf60 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65  ment is the file
1cf70 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73  name pointer pas
1cf80 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70  sed into the xOp
1cf90 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  en().** method o
1cfa0 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  f a VFS implemen
1cfb0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61  tation.  The zPa
1cfc0 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ram argument is 
1cfd0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1cfe0 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
1cff0 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69  er we seek.  Thi
1d000 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1d010 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1d020 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72  he zParam.** par
1d030 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69  ameter if it exi
1d040 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72  sts.  If the par
1d050 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20  ameter does not 
1d060 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  exist, this rout
1d070 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ine.** returns a
1d080 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
1d090 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1d0a0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1d0b0 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
1d0c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1d0d0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a   char *zParam){.
1d0e0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
1d0f0 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20  =0 || zParam==0 
1d100 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
1d110 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1d120 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1d130 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
1d140 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
1d150 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
1d160 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
1d170 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
1d180 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1d190 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1d1a0 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
1d1b0 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
1d1c0 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
1d1d0 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1d1e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1d1f0 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1d200 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1d210 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1d220 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
1d230 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1d240 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1d250 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1d260 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1d270 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1d280 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
1d290 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
1d2a0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1d2b0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1d2c0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1d2d0 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
1d2e0 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
1d2f0 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
1d300 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
1d310 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
1d320 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
1d330 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
1d340 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1d350 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
1d360 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
1d370 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
1d380 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1d390 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
1d3a0 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
1d3b0 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
1d3c0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
1d3d0 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
1d3e0 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
1d3f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d400 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
1d410 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
1d420 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
1d430 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1d440 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1d450 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1d460 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1d470 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d480 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
1d490 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
1d4a0 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54  64(z, &v)==SQLIT
1d4b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
1d4c0 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
1d4d0 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
1d4e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
1d4f0 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
1d500 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
1d510 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
1d520 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1d530 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
1d540 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
1d550 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1d560 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1d570 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1d580 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1d590 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
1d5a0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20  ->aDb[i].pBt.   
1d5b0 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30    && (zDbName==0
1d5c0 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
1d5d0 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e  mp(zDbName, db->
1d5e0 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aDb[i].zName)==0
1d5f0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1d600 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d  eturn db->aDb[i]
1d610 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .pBt;.    }.  }.
1d620 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1d630 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d640 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
1d650 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
1d660 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1d670 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
1d680 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
1d690 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
1d6a0 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
1d6b0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1d6c0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1d6d0 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
1d6e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1d6f0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1d700 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1d710 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
1d720 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
1d730 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
1d740 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
1d750 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44    pBt = sqlite3D
1d760 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1d770 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
1d780 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
1d790 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
1d7a0 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
1d7b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1d7c0 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
1d7d0 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
1d7e0 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
1d7f0 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
1d800 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
1d810 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
1d820 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
1d830 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1d840 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1d850 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
1d860 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d870 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1d880 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1d890 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1d8a0 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
1d8b0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1d8c0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1d8d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
1d8e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
1d8f0 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
1d900 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
1d910 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
1d920 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29  eIsReadonly(pBt)
1d930 20 3a 20 2d 31 3b 0a 7d 0a                        : -1;.}.