/ Hex Artifact Content
Login

Artifact 6facbb3214a492d09022ac8414dc83d07d5d5f41:


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 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
4430: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4440: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
4450: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
4460: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4470: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
4480: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
4490: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
44a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
44b0: 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61  mnReq = va_arg(a
44c0: 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20  p, int);..      
44d0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
44e0: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20  lConfig.mnReq<1 
44f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4500: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4510: 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  nReq = 1;.      
4520: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
4530: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
4540: 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20  Req>(1<<12) ){. 
4550: 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69         /* cap mi
4560: 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61  n request size a
4570: 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20  t 2^12 */.      
4580: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4590: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31  onfig.mnReq = (1
45a0: 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  <<12);.      }..
45b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
45c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
45d0: 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eap==0 ){.      
45e0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
45f0: 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39 20  : R-49920-60189 
4600: 49 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 69  If the first poi
4610: 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72 79  nter (the memory
4620: 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20 20   pointer).      
4630: 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68    ** is NULL, th
4640: 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72 74  en SQLite revert
4650: 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64  s to using its d
4660: 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c  efault memory al
4670: 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20 20  locator.        
4680: 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20 6d  ** (the system m
4690: 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e  alloc() implemen
46a0: 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67  tation), undoing
46b0: 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f 63   any prior invoc
46c0: 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20  ation of.       
46d0: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
46e0: 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20  G_MALLOC..      
46f0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
4700: 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33 47  Setting sqlite3G
4710: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f  lobalConfig.m to
4720: 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20   all zeros will 
4730: 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a  cause malloc to.
4740: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65 72          ** rever
4750: 74 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74  t to its default
4760: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
4770: 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69  when sqlite3_ini
4780: 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75 6e  tialize() is run
4790: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
47a0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69      memset(&sqli
47b0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
47c0: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  m, 0, sizeof(sql
47d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
47e0: 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  .m));.      }els
47f0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
4800: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30  IDENCE-OF: R-610
4810: 30 36 2d 30 38 39 31 38 20 49 66 20 74 68 65 20  06-08918 If the 
4820: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 69  memory pointer i
4830: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4840: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  the.        ** a
4850: 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72  lternative memor
4860: 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65  y allocator is e
4870: 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c 65  ngaged to handle
4880: 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a   all of SQLites.
4890: 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72          ** memor
48a0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65  y allocation nee
48b0: 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ds. */.#ifdef SQ
48c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
48d0: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
48e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
48f0: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
4900: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
4910: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4920: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
4930: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4940: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
4950: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
4960: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
4970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4980: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4990: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
49a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
49b0: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
49c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
49d0: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
49e0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
49f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4a00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
4a10: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4a20: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4a30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4a40: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
4a50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4a60: 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e 20  logger function 
4a70: 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72  and its first ar
4a80: 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54  gument..    ** T
4a90: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55  he default is NU
4aa0: 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20  LL.  Logging is 
4ab0: 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20  disabled if the 
4ac0: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
4ad0: 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e   is.    ** NULL.
4ae0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4af0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
4b00: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  OG: {.      /* M
4b10: 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f  SVC is picky abo
4b20: 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20  ut pulling func 
4b30: 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73  ptrs from va lis
4b40: 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74  ts..      ** htt
4b50: 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72  p://support.micr
4b60: 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39  osoft.com/kb/479
4b70: 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  61.      ** sqli
4b80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4b90: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
4ba0: 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c  , void(*)(void*,
4bb0: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
4bc0: 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  );.      */.    
4bd0: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
4be0: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
4bf0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
4c00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4c10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
4c20: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c  g = va_arg(ap, L
4c30: 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20  OGFUNC_t);.     
4c40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4c50: 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76  nfig.pLogArg = v
4c60: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4c70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4c80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49     }..    /* EVI
4c90: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34  DENCE-OF: R-5554
4ca0: 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d 70  8-33817 The comp
4cb0: 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e 67  ile-time setting
4cc0: 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61 6d   for URI filenam
4cd0: 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  es.    ** can be
4ce0: 20 63 68 61 6e 67 65 64 20 61 74 20 73 74 61 72   changed at star
4cf0: 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 65  t-time using the
4d00: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
4d10: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
4d20: 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20  NFIG_URI,1) or. 
4d30: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
4d40: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
4d50: 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69 67  IG_URI,0) config
4d60: 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20  uration calls.. 
4d70: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4d80: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
4d90: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
4da0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35  DENCE-OF: R-2545
4db0: 31 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c 49  1-61125 The SQLI
4dc0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70  TE_CONFIG_URI op
4dd0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
4de0: 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  gle.      ** arg
4df0: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
4e00: 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t. If non-zero, 
4e10: 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e  then URI handlin
4e20: 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20  g is globally.  
4e30: 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
4e40: 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
4e50: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55   is zero, then U
4e60: 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67  RI handling is g
4e70: 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  lobally.      **
4e80: 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20   disabled. */.  
4e90: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4ea0: 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
4eb0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4ec0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
4ed0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4ee0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43   SQLITE_CONFIG_C
4ef0: 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43  OVERING_INDEX_SC
4f00: 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AN: {.      /* E
4f10: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36  VIDENCE-OF: R-36
4f20: 35 39 32 2d 30 32 37 37 32 20 54 68 65 20 53 51  592-02772 The SQ
4f30: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45  LITE_CONFIG_COVE
4f40: 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a  RING_INDEX_SCAN.
4f50: 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20        ** option 
4f60: 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69  takes a single i
4f70: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20  nteger argument 
4f80: 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
4f90: 65 74 65 64 20 61 73 20 61 0a 20 20 20 20 20 20  eted as a.      
4fa0: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72  ** boolean in or
4fb0: 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72  der to enable or
4fc0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 75 73 65   disable the use
4fd0: 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
4fe0: 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a  ices for.      *
4ff0: 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * full table sca
5000: 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  ns in the query 
5010: 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20  optimizer. */.  
5020: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5030: 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 20  lConfig.bUseCis 
5040: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5050: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5060: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5070: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
5080: 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  OG.    case SQLI
5090: 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
50a0: 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
50b0: 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55  f void(*SQLLOGFU
50c0: 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c  NC_t)(void*, sql
50d0: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
50e0: 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  r*, int);.      
50f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5100: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61  fig.xSqllog = va
5110: 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46  _arg(ap, SQLLOGF
5120: 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71  UNC_t);.      sq
5130: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5140: 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76  g.pSqllogArg = v
5150: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20 2a  a_arg(ap, void *
5160: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5170: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5180: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5190: 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  NFIG_MMAP_SIZE: 
51a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
51b0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d  NCE-OF: R-58063-
51c0: 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e  38258 SQLITE_CON
51d0: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61  FIG_MMAP_SIZE ta
51e0: 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a 20  kes two 64-bit. 
51f0: 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20       ** integer 
5200: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
5210: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
5220: 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61 70  the default mmap
5230: 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20   size limit.    
5240: 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75 6c    ** (the defaul
5250: 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50 52  t setting for PR
5260: 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20  AGMA mmap_size) 
5270: 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
5280: 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a  allowed.      **
5290: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
52a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
52b0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20  e3_int64 szMmap 
52c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
52d0: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
52e0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
52f0: 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   mxMmap = va_arg
5300: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
5310: 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  64);.      /* EV
5320: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33  IDENCE-OF: R-533
5330: 36 37 2d 34 33 31 39 30 20 49 66 20 65 69 74 68  67-43190 If eith
5340: 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  er argument to t
5350: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20  his option is.  
5360: 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c      ** negative,
5370: 20 74 68 65 6e 20 74 68 61 74 20 61 72 67 75 6d   then that argum
5380: 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20 74  ent is changed t
5390: 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69  o its compile-ti
53a0: 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20  me default..    
53b0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
53c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39  IDENCE-OF: R-349
53d0: 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61 78  93-45031 The max
53e0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61  imum allowed mma
53f0: 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20  p size will be. 
5400: 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79       ** silently
5410: 20 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e 65   truncated if ne
5420: 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20  cessary so that 
5430: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65  it does not exce
5440: 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ed the.      ** 
5450: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78  compile-time max
5460: 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73  imum mmap size s
5470: 65 74 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  et by the SQLITE
5480: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20  _MAX_MMAP_SIZE. 
5490: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
54a0: 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20  time option..   
54b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
54c0: 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d  mxMmap<0 || mxMm
54d0: 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  ap>SQLITE_MAX_MM
54e0: 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  AP_SIZE ){.     
54f0: 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49     mxMmap = SQLI
5500: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5520: 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73  if( szMmap<0 ) s
5530: 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
5540: 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
5550: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
5560: 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61  ap>mxMmap) szMma
5570: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5580: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5590: 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d  onfig.mxMmap = m
55a0: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
55b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
55c0: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
55d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
55e0: 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
55f0: 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e  _OS_WIN && defin
5600: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5610: 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20  MALLOC) /* IMP: 
5620: 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f  R-04780-55815 */
5630: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5640: 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45  _CONFIG_WIN32_HE
5650: 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  APSIZE: {.      
5660: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5670: 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51  R-34926-03360 SQ
5680: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33  LITE_CONFIG_WIN3
5690: 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73  2_HEAPSIZE takes
56a0: 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20   a 32-bit.      
56b0: 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  ** unsigned inte
56c0: 67 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73  ger value that s
56d0: 70 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78  pecifies the max
56e0: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
56f0: 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a   created.      *
5700: 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20  * heap. */.     
5710: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5720: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
5730: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
5740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5750: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
5760: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5770: 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73  PMASZ: {.      s
5780: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5790: 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72  ig.szPma = va_ar
57a0: 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
57b0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
57c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ;.    }..    def
57d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
57e0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
57f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5800: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
5810: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
5820: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
5830: 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  up the lookaside
5840: 20 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64   buffers for a d
5850: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5860: 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  on..** Return SQ
5870: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
5880: 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b  ss.  .** If look
5890: 61 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79  aside is already
58a0: 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20   active, return 
58b0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a  SQLITE_BUSY..**.
58c0: 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65  ** The sz parame
58d0: 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ter is the numbe
58e0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61  r of bytes in ea
58f0: 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f  ch lookaside slo
5900: 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61  t..** The cnt pa
5910: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
5920: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20  umber of slots. 
5930: 20 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55   If pStart is NU
5940: 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  LL the.** space 
5950: 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  for the lookasid
5960: 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61  e memory is obta
5970: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
5980: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49  3_malloc()..** I
5990: 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20  f pStart is not 
59a0: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20  NULL then it is 
59b0: 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20  sz*cnt bytes of 
59c0: 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f  memory to use fo
59d0: 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69  r.** the lookasi
59e0: 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  de memory..*/.st
59f0: 61 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f  atic int setupLo
5a00: 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20  okaside(sqlite3 
5a10: 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  *db, void *pBuf,
5a20: 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74   int sz, int cnt
5a30: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72  ){.  void *pStar
5a40: 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  t;.  if( db->loo
5a50: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20  kaside.nOut ){. 
5a60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5a70: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
5a80: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
5a90: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
5aa0: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
5ab0: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
5ac0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
5ad0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
5ae0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
5af0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
5b00: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
5b10: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
5b20: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
5b30: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
5b40: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
5b50: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
5b60: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
5b70: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
5b80: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
5b90: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
5ba0: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
5bb0: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
5bc0: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
5bd0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
5be0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
5bf0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
5c00: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
5c10: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
5c20: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
5c30: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
5c40: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
5c50: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
5c60: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
5c70: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
5c80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
5c90: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5ca0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
5cb0: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
5cc0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
5cd0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
5ce0: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
5cf0: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
5d00: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
5d10: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
5d20: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
5d30: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
5d40: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
5d50: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
5d60: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
5d70: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
5d80: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
5d90: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
5da0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
5db0: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
5dc0: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
5dd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
5de0: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
5df0: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
5e00: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
5e10: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
5e20: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  ) );.    p = (Lo
5e30: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
5e40: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
5e50: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
5e60: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
5e70: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
5e80: 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62  .pFree;.      db
5e90: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
5ea0: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  e = p;.      p =
5eb0: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
5ec0: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
5ed0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
5ee0: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
5ef0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
5f00: 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31  ide.bEnabled = 1
5f10: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
5f20: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
5f30: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
5f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
5f50: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
5f60: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
5f70: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64  okaside.pEnd = d
5f80: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
5f90: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
5fa0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    db->looka
5fb0: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
5fc0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5fd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5fe0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5ff0: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
6000: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
6010: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
6020: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73  sqlite3_mutex *s
6030: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
6040: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
6050: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6060: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6070: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6080: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
6090: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
60a0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
60b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
60c0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
60d0: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
60e0: 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d  .** Free up as m
60f0: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65  uch memory as we
6100: 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69   can from the gi
6110: 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ven database.** 
6120: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  connection..*/.i
6130: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
6140: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c  lease_memory(sql
6150: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6160: 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   i;..#ifdef SQLI
6170: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
6180: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
6190: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
61a0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
61b0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
61c0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
61d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
61e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
61f0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
6200: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
6210: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6220: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
6230: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6240: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
6250: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
6260: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
6270: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
6280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
6290: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
62a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
62b0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
62c0: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
62d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
62e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
62f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6300: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
6310: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
6320: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
6330: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
6340: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
6350: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
6360: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
6370: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6380: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
6390: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
63a0: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
63b0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
63c0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
63d0: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
63e0: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
63f0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
6400: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
6410: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
6420: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
6430: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
6440: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
6450: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
6460: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
6470: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
6480: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
6490: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
64a0: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
64b0: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
64c0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
64e0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
64f0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
6500: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
6510: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
6520: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
6530: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
6540: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
6550: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
6560: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
6570: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
6580: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
6590: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
65a0: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
65b0: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
65c0: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
65d0: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
65e0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
65f0: 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62  GER, SQLITE_Enab
6600: 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20  leTrigger  },.  
6610: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
6620: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
6630: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
6640: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
6650: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
6660: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6670: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
6680: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
6690: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
66a0: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
66b0: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
66c0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
66d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
66e0: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
66f0: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
6700: 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73      int oldFlags
6710: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
6720: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
6730: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
6740: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
6750: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
6760: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6770: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
6780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
6790: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
67a0: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
67b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
67c0: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
67d0: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
67e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
67f0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
6800: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
6810: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6820: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
6830: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
6840: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
6850: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
6860: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
6870: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
6880: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
68a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
68b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
68c0: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
68d0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
68e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
68f0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
6900: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
6910: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
6920: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
6930: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
6940: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
6950: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
6960: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
6970: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
6980: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
6990: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
69a0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
69b0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
69c0: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
69d0: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
69e0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
69f0: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
6a00: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
6a10: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
6a20: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
6a30: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
6a40: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
6a50: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
6a60: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
6a70: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
6a80: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
6a90: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
6aa0: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
6ab0: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
6ac0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
6ad0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
6ae0: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
6af0: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
6b00: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20  1 : nKey2;.  /* 
6b10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
6b20: 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62  5033-28449 The b
6b30: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
6b40: 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65  ollation compare
6b50: 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62  s.  ** strings b
6b60: 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e  yte by byte usin
6b70: 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  g the memcmp() f
6b80: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  unction from the
6b90: 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a   standard C.  **
6ba0: 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 72   library. */.  r
6bb0: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
6bc0: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
6bd0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
6be0: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
6bf0: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
6c00: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
6c10: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
6c20: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
6c30: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
6c40: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
6c50: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
6c60: 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37  F: R-31624-24737
6c70: 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42   RTRIM is like B
6c80: 49 4e 41 52 59 20 65 78 63 65 70 74 20 74 68 61  INARY except tha
6c90: 74 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a  t extra.      **
6ca0: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
6cb0: 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73 74 72  nd of either str
6cc0: 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  ing do not chang
6cd0: 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e  e the result. In
6ce0: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
6cf0: 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77  words, strings w
6d00: 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61  ill compare equa
6d10: 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  l to one another
6d20: 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79   as long as they
6d30: 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72  .      ** differ
6d40: 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d   only in the num
6d50: 62 65 72 20 6f 66 20 73 70 61 63 65 73 20 61 74  ber of spaces at
6d60: 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20   the end..      
6d70: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
6d80: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
6d90: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
6da0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6db0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
6dc0: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
6dd0: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
6de0: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
6df0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
6e00: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
6e10: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
6e20: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74  case independent
6e30: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
6e40: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
6e50: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
6e60: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
6e70: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
6e80: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
6e90: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
6ea0: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
6eb0: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
6ec0: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
6ed0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
6ee0: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
6ef0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
6f00: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
6f10: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
6f20: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
6f30: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
6f40: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
6f50: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
6f60: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
6f70: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
6f80: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
6f90: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
6fa0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6fb0: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
6fc0: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
6fd0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
6fe0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
6ff0: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
7000: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
7010: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7030: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
7040: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
7050: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
7060: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
7070: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
7080: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7090: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
70a0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
70b0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
70c0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
70d0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
70e0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
70f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7100: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7110: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
7120: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7130: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
7140: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
7150: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
7160: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
7170: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
7180: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
7190: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
71a0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
71b0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
71c0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
71d0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
71e0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
71f0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7200: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7210: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
7220: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
7230: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7240: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
7250: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
7260: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
7270: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
7280: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
7290: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
72a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
72b0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
72c0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
72d0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
72e0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
72f0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
7300: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
7310: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
7320: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
7330: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
7340: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
7350: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
7360: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
7370: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
7380: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
7390: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
73a0: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
73b0: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
73c0: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
73d0: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
73e0: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
73f0: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
7400: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
7410: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
7420: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
7430: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
7440: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
7450: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
7460: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
7470: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
7480: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7490: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
74a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
74b0: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
74c0: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
74d0: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
74e0: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
74f0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
7500: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
7510: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7520: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
7530: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
7540: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
7550: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
7560: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
7570: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
7580: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
7590: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
75a0: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
75b0: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
75c0: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
75d0: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
75e0: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
75f0: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
7600: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
7610: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
7620: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
7630: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
7640: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
7650: 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72  = p->pDestructor
7660: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ;.  if( pDestruc
7670: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
7680: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  ructor->nRef--;.
7690: 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63      if( pDestruc
76a0: 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  tor->nRef==0 ){.
76b0: 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f        pDestructo
76c0: 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73  r->xDestroy(pDes
76d0: 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61  tructor->pUserDa
76e0: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
76f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
7700: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
7710: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
7720: 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c  sconnect all sql
7730: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
7740: 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
7750: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7760: 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73  tion.** db. This
7770: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
7780: 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73  db is being clos
7790: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
77a0: 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  id disconnectAll
77b0: 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62  Vtab(sqlite3 *db
77c0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
77d0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
77e0: 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  BLE.  int i;.  s
77f0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7800: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
7810: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
7820: 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20  ++){.    Schema 
7830: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
7840: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[i].pSchema;. 
7850: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
7860: 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
7870: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
7880: 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69        for(p=sqli
7890: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
78a0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
78b0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
78c0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20  ext(p)){.       
78d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28   Table *pTab = (
78e0: 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  Table *)sqliteHa
78f0: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20  shData(p);.     
7900: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
7910: 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33  (pTab) ) sqlite3
7920: 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64  VtabDisconnect(d
7930: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
7940: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
7950: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
7960: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
7970: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
7980: 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  db);.#else.  UNU
7990: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
79a0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
79b0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
79c0: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
79d0: 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66  ction db has unf
79e0: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
79f0: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
7a00: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
7a10: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
7a20: 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ects.  .*/.stati
7a30: 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  c int connection
7a40: 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a  IsBusy(sqlite3 *
7a50: 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  db){.  int j;.  
7a60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7a70: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
7a80: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64  utex) );.  if( d
7a90: 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72  b->pVdbe ) retur
7aa0: 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  n 1;.  for(j=0; 
7ab0: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
7ac0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
7ad0: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74  = db->aDb[j].pBt
7ae0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
7af0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
7b00: 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72  nBackup(pBt) ) r
7b10: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
7b20: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
7b30: 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74  * Close an exist
7b40: 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62  ing SQLite datab
7b50: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ase.*/.static in
7b60: 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73  t sqlite3Close(s
7b70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
7b80: 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20  forceZombie){.  
7b90: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f  if( !db ){.    /
7ba0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
7bb0: 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c  -63257-11740 Cal
7bc0: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ling sqlite3_clo
7bd0: 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  se() or.    ** s
7be0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
7bf0: 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f  ) with a NULL po
7c00: 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69  inter argument i
7c10: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
7c20: 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  op. */.    retur
7c30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7c40: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
7c50: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
7c60: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
7c70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
7c80: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  SE_BKPT;.  }.  s
7c90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7ca0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
7cb0: 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63    /* Force xDisc
7cc0: 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20  onnect calls on 
7cd0: 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c  all virtual tabl
7ce0: 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65  es */.  disconne
7cf0: 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a  ctAllVtab(db);..
7d00: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
7d10: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74  ction is open, t
7d20: 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  he disconnectAll
7d30: 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76  Vtab() call abov
7d40: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
7d50: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
7d60: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
7d70: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
7d80: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
7d90: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
7da0: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
7db0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
7dc0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
7dd0: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
7de0: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
7df0: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
7e00: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
7e10: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
7e20: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
7e30: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
7e40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
7e50: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
7e60: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
7e70: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
7e80: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
7e90: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
7ea0: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67  k(db);..  /* Leg
7eb0: 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71  acy behavior (sq
7ec0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65  lite3_close() be
7ed0: 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65  havior) is to re
7ee0: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
7ef0: 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e  _BUSY if the con
7f00: 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20  nection can not 
7f10: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
7f20: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
7f30: 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26  ( !forceZombie &
7f40: 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  & connectionIsBu
7f50: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
7f60: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
7f70: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
7f80: 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c  Y, "unable to cl
7f90: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
7fa0: 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20  alized ".       
7fb0: 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75  "statements or u
7fc0: 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70  nfinished backup
7fd0: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
7fe0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7ff0: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
8000: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
8010: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
8020: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
8030: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
8040: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
8050: 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c  log ){.    /* Cl
8060: 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65  osing the handle
8070: 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
8080: 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65  er is passed the
8090: 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20   value 2. */.   
80a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
80b0: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c  nfig.xSqllog(sql
80c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
80d0: 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c  .pSqllogArg, db,
80e0: 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 2);.  }.#end
80f0: 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  if..  /* Convert
8100: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8110: 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e  into a zombie an
8120: 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e  d then close it.
8130: 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69  .  */.  db->magi
8140: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
8150: 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74  _ZOMBIE;.  sqlit
8160: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
8170: 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a  loseZombie(db);.
8180: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8190: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  OK;.}../*.** Two
81a0: 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74   variations on t
81b0: 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66  he public interf
81c0: 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  ace for closing 
81d0: 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
81e0: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71  nnection. The sq
81f0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65  lite3_close() ve
8200: 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  rsion returns SQ
8210: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
8220: 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e   leaves the conn
8230: 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66  ection option if
8240: 20 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e   there are unfin
8250: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
8260: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
8270: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
8280: 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68  te3_backups.  Th
8290: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  e sqlite3_close_
82a0: 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  v2().** version 
82b0: 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65  forces the conne
82c0: 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20  ction to become 
82d0: 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72  a zombie if ther
82e0: 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65  e are.** unclose
82f0: 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64  d resources, and
8300: 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65   arranges for de
8310: 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20  allocation when 
8320: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70  the last.** prep
8330: 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  are statement or
8340: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8350: 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  closes..*/.int s
8360: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c  qlite3_close(sql
8370: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
8380: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
8390: 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  b,0); }.int sqli
83a0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c  te3_close_v2(sql
83b0: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
83c0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
83d0: 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  b,1); }.../*.** 
83e0: 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  Close the mutex 
83f0: 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  on database conn
8400: 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a  ection db..**.**
8410: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66   Furthermore, if
8420: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8430: 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d  tion db is a zom
8440: 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  bie (meaning tha
8450: 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62  t there.** has b
8460: 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  een a prior call
8470: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
8480: 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33  e(db) or sqlite3
8490: 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61  _close_v2(db)) a
84a0: 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69  nd.** every sqli
84b0: 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77  te3_stmt has now
84c0: 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
84d0: 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65  and every sqlite
84e0: 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20  3_backup has.** 
84f0: 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66  finished, then f
8500: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
8510: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
8520: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
8530: 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74  loseZombie(sqlit
8540: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
8550: 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20  lem *i;         
8560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
8570: 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f  sh table iterato
8580: 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  r */.  int j;.. 
8590: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
85a0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c   outstanding sql
85b0: 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c  ite3_stmt or sql
85c0: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
85d0: 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74  cts.  ** or if t
85e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
85f0: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
8600: 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33  losed by sqlite3
8610: 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a  _close_v2(),.  *
8620: 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76  * then just leav
8630: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
8640: 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
8650: 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51  f( db->magic!=SQ
8660: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
8670: 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  E || connectionI
8680: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
8690: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
86a0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
86b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
86c0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
86d0: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
86e0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
86f0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8700: 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c  tion has.  ** cl
8710: 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33  osed all sqlite3
8720: 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65  _stmt and sqlite
8730: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
8740: 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20   and has been.  
8750: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ** passed to sql
8760: 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e  ite3_close (mean
8770: 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61  ing that it is a
8780: 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65   zombie).  There
8790: 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68  fore,.  ** go ah
87a0: 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ead and free all
87b0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f   resources..  */
87c0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
87d0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
87e0: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54   roll it back. T
87f0: 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73  his also ensures
8800: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e   that if.  ** an
8810: 79 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  y database schem
8820: 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  as have been mod
8830: 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f  ified by an unco
8840: 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
8850: 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72  ion.  ** they ar
8860: 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61  e reset. And tha
8870: 74 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62  t the required b
8880: 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
8890: 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eld to make.  **
88a0: 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62   the pager rollb
88b0: 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72  ack and schema r
88c0: 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f  eset an atomic o
88d0: 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73  peration. */.  s
88e0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
88f0: 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
8900: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  ;..  /* Free any
8910: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76   outstanding Sav
8920: 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
8930: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
8940: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
8950: 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  b);..  /* Close 
8960: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
8970: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f  nections */.  fo
8980: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
8990: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
89a0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
89b0: 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->aDb[j];.    if
89c0: 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pDb->pBt ){.  
89d0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
89e0: 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b  Close(pDb->pBt);
89f0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20  .      pDb->pBt 
8a00: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  = 0;.      if( j
8a10: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=1 ){.        p
8a20: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
8a30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8a40: 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68   }.  /* Clear th
8a50: 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65  e TEMP schema se
8a60: 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73  parately and las
8a70: 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  t */.  if( db->a
8a80: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
8a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
8aa0: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
8ab0: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  1].pSchema);.  }
8ac0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
8ad0: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20  lockList(db);.. 
8ae0: 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20   /* Free up the 
8af0: 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61  array of auxilia
8b00: 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  ry databases */.
8b10: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
8b20: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
8b30: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
8b40: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
8b50: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
8b60: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
8b70: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
8b80: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
8b90: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
8ba0: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
8bb0: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
8bc0: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
8bd0: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
8be0: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
8bf0: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
8c00: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
8c10: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
8c20: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41  ..  for(j=0; j<A
8c30: 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75  rraySize(db->aFu
8c40: 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nc.a); j++){.   
8c50: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c   FuncDef *pNext,
8c60: 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20   *pHash, *p;.   
8c70: 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63   for(p=db->aFunc
8c80: 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73  .a[j]; p; p=pHas
8c90: 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20  h){.      pHash 
8ca0: 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20  = p->pHash;.    
8cb0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
8cc0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65        functionDe
8cd0: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20  stroy(db, p);.  
8ce0: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
8cf0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
8d00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8d10: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  , p);.        p 
8d20: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
8d30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8d40: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
8d50: 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  st(&db->aCollSeq
8d60: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
8d70: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
8d80: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8d90: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
8da0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
8db0: 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79     /* Invoke any
8dc0: 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67   destructors reg
8dd0: 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c  istered for coll
8de0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
8df0: 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  ser data. */.   
8e00: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
8e10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
8e20: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a  Coll[j].xDel ){.
8e30: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d          pColl[j]
8e40: 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70  .xDel(pColl[j].p
8e50: 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  User);.      }. 
8e60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8e70: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c  DbFree(db, pColl
8e80: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8e90: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
8ea0: 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
8eb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
8ec0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72  RTUALTABLE.  for
8ed0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
8ee0: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
8ef0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
8f00: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d  hNext(i)){.    M
8f10: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
8f20: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
8f30: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
8f40: 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f  f( pMod->xDestro
8f50: 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d  y ){.      pMod-
8f60: 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e  >xDestroy(pMod->
8f70: 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pAux);.    }.   
8f80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8f90: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
8fa0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
8fb0: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
8fc0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
8fd0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
8fe0: 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  E_OK); /* Deallo
8ff0: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
9000: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
9010: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  */.  sqlite3Valu
9020: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
9030: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
9040: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23  xtensions(db);.#
9050: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
9060: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
9070: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
9080: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29  >auth.zAuthUser)
9090: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
90a0: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50  (db->auth.zAuthP
90b0: 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  W);.#endif..  db
90c0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
90d0: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
90e0: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
90f0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
9100: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
9110: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
9120: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
9130: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
9140: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
9150: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
9160: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
9170: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
9180: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
9190: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
91a0: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
91b0: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
91c0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
91d0: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
91e0: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
91f0: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
9200: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
9210: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
9220: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9230: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
9240: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
9250: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9260: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
9270: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
9280: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
9290: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
92a0: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
92b0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
92c0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
92d0: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
92e0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
92f0: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
9300: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
9310: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
9320: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9330: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
9340: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9350: 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  _free(db);.}../*
9360: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
9370: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
9380: 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73    If tripCode is
9390: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20   not SQLITE_OK, 
93a0: 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74  then.** any writ
93b0: 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  e cursors are in
93c0: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
93d0: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
93e0: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
93f0: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
9400: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
9410: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
9420: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
9430: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
9440: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
9450: 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72 73  r.  Read cursors
9460: 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64   remain open and
9470: 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72   valid.** but ar
9480: 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61 73  e "saved" in cas
9490: 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67 65  e the table page
94a0: 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75  s are moved arou
94b0: 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nd..*/.void sqli
94c0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
94d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
94e0: 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
94f0: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
9500: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68  s = 0;.  int sch
9510: 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73  emaChange;.  ass
9520: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9530: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
9540: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
9550: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
9560: 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  ();..  /* Obtain
9570: 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65   all b-tree mute
9580: 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  xes before makin
9590: 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42  g any calls to B
95a0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  treeRollback(). 
95b0: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d  .  ** This is im
95c0: 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20  portant in case 
95d0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
95e0: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
95f0: 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66  k has.  ** modif
9600: 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
9610: 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20   schema. If the 
9620: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 61  b-tree mutexes a
9630: 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a  re not taken.  *
9640: 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f  * here, then ano
9650: 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
9660: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67  e connection mig
9670: 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77  ht sneak in betw
9680: 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  een.  ** the dat
9690: 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61  abase rollback a
96a0: 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c  nd schema reset,
96b0: 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73 65   which can cause
96c0: 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72   false.  ** corr
96d0: 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69  uption reports i
96e0: 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a  n some cases.  *
96f0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
9700: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
9710: 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28  schemaChange = (
9720: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
9730: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
9740: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
9750: 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72  .busy==0;..  for
9760: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
9770: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
9780: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
9790: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
97a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
97b0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
97c0: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  ns(p) ){.       
97d0: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
97e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
97f0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
9800: 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73  (p, tripCode, !s
9810: 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20  chemaChange);.  
9820: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
9830: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
9840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
9850: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
9860: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
9870: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
9880: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
9890: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
98a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
98b0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
98c0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
98d0: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
98e0: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
98f0: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
9900: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
9910: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
9920: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
9930: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
9940: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
9950: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
9960: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
9970: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
9980: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
9990: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
99a0: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
99b0: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
99c0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
99d0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
99e0: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
99f0: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
9a00: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
9a10: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
9a20: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
9a30: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
9a40: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
9a50: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
9a60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9a70: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
9a80: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
9a90: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
9aa0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
9ab0: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
9ac0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
9ad0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
9ae0: 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  (defined(SQLITE_
9af0: 44 45 42 55 47 29 20 26 26 20 53 51 4c 49 54 45  DEBUG) && SQLITE
9b00: 5f 4f 53 5f 57 49 4e 29 20 7c 7c 20 64 65 66 69  _OS_WIN) || defi
9b10: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
9b20: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
9b30: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
9b40: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
9b50: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
9b60: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
9b70: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
9b80: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
9b90: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
9ba0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
9bb0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
9bc0: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
9bd0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9be0: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
9c00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9c10: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
9c20: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9c30: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
9c40: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
9c50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9c60: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
9c70: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
9c80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
9c90: 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20  RNAL";          
9ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9cb0: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9cd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52  me = "SQLITE_PER
9ce0: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
9cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9d00: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9d20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
9d30: 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  ORT";           
9d40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9d50: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
9d60: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a  _ROLLBACK:     z
9d70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
9d80: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  BORT_ROLLBACK"; 
9d90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9da0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
9db0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
9dc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9dd0: 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20  BUSY";          
9de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9df0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
9e00: 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20  Y_RECOVERY:     
9e10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9e20: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b  _BUSY_RECOVERY";
9e30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9e40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
9e50: 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20  SY_SNAPSHOT:    
9e60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9e70: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22  E_BUSY_SNAPSHOT"
9e80: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9e90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
9ea0: 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20  OCKED:          
9eb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9ec0: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
9ed0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9ee0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9ef0: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
9f00: 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  HE: zName = "SQL
9f10: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
9f20: 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20  DCACHE";break;. 
9f30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9f40: 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20  _NOMEM:         
9f50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9f60: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  LITE_NOMEM";    
9f70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9f80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9f90: 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20  E_READONLY:     
9fa0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9fb0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b  QLITE_READONLY";
9fc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9fd0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9fe0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f  TE_READONLY_RECO
9ff0: 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  VERY:  zName = "
a000: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a010: 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b  RECOVERY"; break
a020: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a030: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
a040: 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  TLOCK:  zName = 
a050: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
a060: 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61  _CANTLOCK"; brea
a070: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a080: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
a090: 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  LLBACK:  zName =
a0a0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
a0b0: 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  Y_ROLLBACK"; bre
a0c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a0d0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
a0e0: 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20  BMOVED:   zName 
a0f0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
a100: 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72  LY_DBMOVED";  br
a110: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a120: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
a130: 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  :          zName
a140: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
a150: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         b
a160: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a170: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
a180: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a190: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a1a0: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
a1b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a1c0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
a1d0: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
a1e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a1f0: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
a200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a210: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a220: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
a230: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a240: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
a250: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a260: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a270: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
a280: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a290: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
a2a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a2b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a2c0: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
a2d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a2e0: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
a2f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a300: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a310: 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
a320: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a330: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
a340: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
a350: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a360: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
a370: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a380: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
a390: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
a3a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a3b0: 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
a3c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a3d0: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
a3e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a3f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a400: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
a410: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a420: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
a430: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a440: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a450: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
a460: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a470: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
a480: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
a490: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a4a0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
a4b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a4c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
a4d0: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      break;
a4e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a4f0: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20  TE_IOERR_NOMEM: 
a500: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a510: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
a520: 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  EM";       break
a530: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a540: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
a550: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
a560: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  "SQLITE_IOERR_AC
a570: 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61  CESS";      brea
a580: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a590: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
a5a0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20  RESERVEDLOCK:.  
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a5d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a5e0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
a5f0: 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  DLOCK"; break;. 
a600: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a610: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20  _IOERR_LOCK:    
a620: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a630: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22  LITE_IOERR_LOCK"
a640: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
a650: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a660: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20  E_IOERR_CLOSE:  
a670: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a680: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
a690: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
a6a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a6b0: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
a6c0: 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  SE:    zName = "
a6d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
a6e0: 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b  _CLOSE";   break
a6f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a700: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
a710: 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  N:      zName = 
a720: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
a730: 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61  MOPEN";     brea
a740: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a750: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
a760: 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ZE:      zName =
a770: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
a780: 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65  HMSIZE";     bre
a790: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a7a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
a7b0: 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  OCK:      zName 
a7c0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a7d0: 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72  SHMLOCK";     br
a7e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a7f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
a800: 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  MAP:       zName
a810: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a820: 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62  _SHMMAP";      b
a830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a840: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45   SQLITE_IOERR_SE
a850: 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  EK:         zNam
a860: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a870: 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20  R_SEEK";        
a880: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a890: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
a8a0: 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61  ELETE_NOENT: zNa
a8b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a8c0: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22  RR_DELETE_NOENT"
a8d0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
a8e0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a8f0: 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e  MMAP:         zN
a900: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a910: 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20  ERR_MMAP";      
a920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a930: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a940: 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a  _GETTEMPPATH:  z
a950: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a960: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
a970: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
a980: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a990: 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20  R_CONVPATH:     
a9a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a9b0: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b  IOERR_CONVPATH";
a9c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a9d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
a9e0: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20  RUPT:           
a9f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aa00: 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20  _CORRUPT";      
aa10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
aa30: 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20  RRUPT_VTAB:     
aa40: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aa50: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
aa60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aa70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
aa80: 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20  OTFOUND:        
aa90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
aaa0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
aab0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aac0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
aad0: 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  FULL:           
aae0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aaf0: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
ab00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ab10: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ab20: 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20  _CANTOPEN:      
ab30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ab40: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
ab50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ab60: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ab70: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
ab80: 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  PDIR: zName = "S
ab90: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
aba0: 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b  OTEMPDIR";break;
abb0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
abc0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
abd0: 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  R:     zName = "
abe0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
abf0: 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b  ISDIR";    break
ac00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac10: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
ac20: 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  LPATH:  zName = 
ac30: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
ac40: 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61  _FULLPATH"; brea
ac50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ac60: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
ac70: 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  NVPATH:  zName =
ac80: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
ac90: 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65  N_CONVPATH"; bre
aca0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
acb0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
acc0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
acd0: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
ace0: 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  OL";          br
acf0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad00: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
ad10: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ad20: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
ad30: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
ad40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ad50: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
ad70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
ad80: 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  MA";            
ad90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ada0: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
adc0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f  me = "SQLITE_TOO
add0: 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  BIG";           
ade0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
adf0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
ae00: 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  AINT:         zN
ae10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
ae20: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
ae30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ae40: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ae50: 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a  RAINT_UNIQUE:  z
ae60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
ae70: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
ae80: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
ae90: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
aea0: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20  TRAINT_TRIGGER: 
aeb0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aec0: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
aed0: 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  ER";break;.     
aee0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
aef0: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
af00: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
af30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
af40: 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72  OREIGNKEY";   br
af50: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
af60: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
af70: 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65  T_CHECK:   zName
af80: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
af90: 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62  RAINT_CHECK";  b
afa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
afb0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
afc0: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20  NT_PRIMARYKEY:. 
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
aff0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b000: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
b010: 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  YKEY";   break;.
b020: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b030: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
b040: 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  NULL: zName = "S
b050: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b060: 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b  _NOTNULL";break;
b070: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b080: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
b090: 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20  MMITHOOK:.      
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b0c0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b0d0: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22  AINT_COMMITHOOK"
b0e0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
b0f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b100: 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20  STRAINT_VTAB:   
b110: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b120: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
b130: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
b140: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b150: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
b160: 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N:.             
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b190: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
b1a0: 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65  NCTION";     bre
b1b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b1c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b1d0: 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20  _ROWID:   zName 
b1e0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b1f0: 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72  AINT_ROWID";  br
b200: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b210: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a  SQLITE_MISMATCH:
b220: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b230: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
b240: 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62  TCH";          b
b250: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b260: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20   SQLITE_MISUSE: 
b270: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b280: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
b290: 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SE";            
b2a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b2b0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b2d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
b2e0: 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  FS";            
b2f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b300: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b320: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
b330: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
b340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b350: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
b360: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
b370: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
b380: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
b390: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b3a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
b3b0: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
b3c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b3d0: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20  RANGE";         
b3e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b3f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
b400: 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20  ADB:            
b410: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b420: 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20  _NOTADB";       
b430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b440: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
b450: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
b460: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b470: 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20  E_ROW";         
b480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b490: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
b4a0: 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20  OTICE:          
b4b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b4c0: 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20  TE_NOTICE";     
b4d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b4e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b4f0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
b500: 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  AL: zName = "SQL
b510: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
b520: 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20  ER_WAL";break;. 
b530: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b540: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
b550: 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20  ROLLBACK:.      
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b580: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
b590: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
b5a0: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
b5b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
b5c0: 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20  NING:           
b5d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b5e0: 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20  _WARNING";      
b5f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b600: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
b610: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a  RNING_AUTOINDEX:
b620: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b630: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
b640: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
b650: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
b660: 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ONE:            
b670: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b680: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
b690: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b6a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e    }.  }.  if( zN
b6b0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ame==0 ){.    st
b6c0: 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35  atic char zBuf[5
b6d0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
b6e0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
b6f0: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51  zBuf), zBuf, "SQ
b700: 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29  LITE_UNKNOWN(%d)
b710: 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20  ", origRc);.    
b720: 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zName = zBuf;.  
b730: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
b740: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
b750: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
b760: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
b770: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
b780: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
b790: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
b7a0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
b7b0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
b7c0: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
b7d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b7e0: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
b7f0: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
b800: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
b810: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
b820: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
b830: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
b840: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
b850: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
b860: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
b870: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
b880: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
b890: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
b8a0: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
b8b0: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
b8c0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
b8d0: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
b8e0: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
b8f0: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
b900: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
b910: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
b920: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
b930: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
b940: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
b950: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
b960: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
b970: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
b980: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
b990: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
b9a0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
b9b0: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
b9c0: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
b9d0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
b9e0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
b9f0: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
ba00: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
ba10: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
ba20: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
ba30: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
ba40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
ba50: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
ba60: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
ba70: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
ba80: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
ba90: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
baa0: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
bab0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
bac0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
bad0: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
bae0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
baf0: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
bb00: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
bb10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
bb20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
bb30: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
bb40: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
bb50: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
bb60: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
bb70: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
bb80: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
bb90: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
bba0: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
bbb0: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
bbc0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
bbd0: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
bbe0: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
bbf0: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
bc00: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
bc10: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
bc20: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
bc30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
bc40: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
bc50: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
bc60: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
bc70: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
bc80: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
bc90: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
bca0: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
bcb0: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
bcc0: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
bcd0: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
bce0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
bcf0: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
bd00: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
bd10: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
bd20: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
bd30: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
bd40: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
bd50: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
bd60: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
bd70: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
bd80: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
bd90: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
bda0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
bdb0: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
bdc0: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
bdd0: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
bde0: 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ",.  };.  const 
bdf0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e  char *zErr = "un
be00: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
be10: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
be20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
be30: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a  ORT_ROLLBACK: {.
be40: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62        zErr = "ab
be50: 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42  ort due to ROLLB
be60: 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ACK";.      brea
be70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
be80: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
be90: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
bea0: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
beb0: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
bec0: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
bed0: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
bee0: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
bef0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
bf00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bf10: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
bf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
bf30: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
bf40: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
bf50: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
bf60: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
bf70: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
bf80: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
bf90: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
bfa0: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
bfb0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
bfc0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
bfd0: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
bfe0: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
bff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c000: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
c010: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64  yCallback(. void
c020: 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20   *ptr,          
c030: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c040: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c050: 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20  int count       
c060: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c070: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c  er of times tabl
c080: 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20  e has been busy 
c090: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
c0a0: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
c0b0: 55 53 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20  USLEEP.  static 
c0c0: 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b  const u8 delays[
c0d0: 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c  ] =.     { 1, 2,
c0e0: 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20   5, 10, 15, 20, 
c0f0: 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30  25, 25,  25,  50
c100: 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20  ,  50, 100 };.  
c110: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
c120: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
c130: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
c140: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
c150: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
c160: 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44  8 };.# define ND
c170: 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64  ELAY ArraySize(d
c180: 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33  elays).  sqlite3
c190: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
c1a0: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
c1b0: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
c1c0: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
c1d0: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
c1e0: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
c1f0: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
c200: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
c210: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
c220: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
c230: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
c240: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
c250: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
c260: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
c270: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
c280: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
c290: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
c2a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
c2b0: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
c2c0: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
c2d0: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
c2e0: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
c2f0: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
c300: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
c310: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
c320: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
c330: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
c340: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
c350: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
c360: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
c370: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
c380: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
c390: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
c3a0: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
c3b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c3c0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
c3d0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
c3e0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
c3f0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c400: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
c410: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
c420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c430: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
c440: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
c450: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
c460: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
c470: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
c480: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
c490: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
c4a0: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
c4b0: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
c4c0: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
c4d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
c4e0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
c4f0: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
c500: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
c510: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
c520: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
c530: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
c540: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
c550: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
c560: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
c570: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
c580: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
c590: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
c5a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
c5b0: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
c5c0: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
c5d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c5e0: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
c5f0: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
c600: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
c610: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
c620: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
c630: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
c640: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
c650: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
c660: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
c670: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
c680: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
c690: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
c6a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c6b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
c6c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
c6d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
c6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
c6f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
c700: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
c710: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
c720: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
c730: 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78  andler.xFunc = x
c740: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
c750: 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70  Handler.pArg = p
c760: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
c770: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
c780: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  ;.  db->busyTime
c790: 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  out = 0;.  sqlit
c7a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
c7b0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
c7c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c7d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c7e0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
c7f0: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
c800: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
c810: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
c820: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
c830: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
c840: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
c850: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
c860: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
c870: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
c880: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
c890: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
c8a0: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
c8b0: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
c8c0: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
c8d0: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
c8e0: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
c8f0: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
c900: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
c910: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
c920: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c930: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
c940: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
c950: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
c960: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
c970: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
c980: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
c990: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
c9a0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
c9b0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
c9c0: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
c9d0: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
c9e0: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
c9f0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75  ProgressOps = (u
ca00: 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20  nsigned)nOps;.  
ca10: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
ca20: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c  rg = pArg;.  }el
ca30: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f  se{.    db->xPro
ca40: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64  gress = 0;.    d
ca50: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
ca60: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  = 0;.    db->pPr
ca70: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
ca80: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
ca90: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
caa0: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
cab0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cac0: 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65  ne installs a de
cad0: 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c  fault busy handl
cae0: 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f  er that waits fo
caf0: 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  r the.** specifi
cb00: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  ed number of mil
cb10: 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
cb20: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f   returning 0..*/
cb30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
cb40: 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65  y_timeout(sqlite
cb50: 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a  3 *db, int ms){.
cb60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cb70: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
cb80: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
cb90: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
cba0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
cbb0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
cbc0: 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  if.  if( ms>0 ){
cbd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
cbe0: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
cbf0: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
cc00: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
cc10: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73  db);.    db->bus
cc20: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
cc30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
cc40: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
cc50: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
cc60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cc70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
cc80: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
cc90: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
cca0: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
ccb0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
ccc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
ccd0: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
cce0: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
ccf0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
cd00: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
cd10: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
cd20: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
cd30: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
cd40: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
cd50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64  ;.  }.#endif.  d
cd60: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
cd70: 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ted = 1;.}.../*.
cd80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cd90: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
cda0: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
cdb0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
cdc0: 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  ), except.** tha
cdd0: 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64  t it is designed
cde0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79   to be called by
cdf0: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20   internal code. 
ce00: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
ce10: 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d  s.** that if a m
ce20: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e  alloc() fails in
ce30: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
ce40: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65  function(), an e
ce50: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
ce60: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
ce70: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
ce80: 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a  ag cleared. .*/.
ce90: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74  int sqlite3Creat
cea0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
ceb0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
cec0: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
ced0: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
cee0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
cef0: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76   *pUserData,.  v
cf00: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
cf10: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
cf20: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
cf30: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
cf40: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
cf50: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
cf60: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
cf70: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
cf80: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
cf90: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
cfa0: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29  r *pDestructor.)
cfb0: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a  {.  FuncDef *p;.
cfc0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69    int nName;.  i
cfd0: 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a  nt extraFlags;..
cfe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cff0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
d000: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
d010: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
d020: 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e  0 ||.      (xFun
d030: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20  c && (xFinal || 
d040: 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20  xStep)) || .    
d050: 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46    (!xFunc && (xF
d060: 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29  inal && !xStep))
d070: 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e   ||.      (!xFun
d080: 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26  c && (!xFinal &&
d090: 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20   xStep)) ||.    
d0a0: 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41    (nArg<-1 || nA
d0b0: 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  rg>SQLITE_MAX_FU
d0c0: 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20  NCTION_ARG) ||. 
d0d0: 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65       (255<(nName
d0e0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
d0f0: 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  30( zFunctionNam
d100: 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  e))) ){.    retu
d110: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d120: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73  _BKPT;.  }..  as
d130: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
d140: 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49  C_CONSTANT==SQLI
d150: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
d160: 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73   );.  extraFlags
d170: 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45   = enc &  SQLITE
d180: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a  _DETERMINISTIC;.
d190: 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45    enc &= (SQLITE
d1a0: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51  _FUNC_ENCMASK|SQ
d1b0: 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69  LITE_ANY);.  .#i
d1c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d1d0: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20  T_UTF16.  /* If 
d1e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
d1f0: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
d200: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
d210: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
d220: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
d230: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
d240: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
d250: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
d260: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
d270: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
d280: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
d290: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
d2a0: 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45  *.  ** If SQLITE
d2b0: 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65  _ANY is specifie
d2c0: 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72  d, add three ver
d2d0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e  sions of the fun
d2e0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  ction.  ** to th
d2f0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20  e hash table..  
d300: 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51  */.  if( enc==SQ
d310: 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20  LITE_UTF16 ){.  
d320: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
d330: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65  TF16NATIVE;.  }e
d340: 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  lse if( enc==SQL
d350: 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69  ITE_ANY ){.    i
d360: 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  nt rc;.    rc = 
d370: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
d380: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
d390: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
d3a0: 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67  E_UTF8|extraFlag
d3b0: 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65  s,.         pUse
d3c0: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
d3d0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
d3e0: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69  structor);.    i
d3f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d400: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d410: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
d420: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
d430: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
d440: 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c  _UTF16LE|extraFl
d450: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ags,.          p
d460: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
d470: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
d480: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
d490: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
d4a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d4c0: 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51    }.    enc = SQ
d4d0: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
d4e0: 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20  }.#else.  enc = 
d4f0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e  SQLITE_UTF8;.#en
d500: 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63  dif.  .  /* Chec
d510: 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  k if an existing
d520: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
d530: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72  ng overridden or
d540: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c   deleted. If so,
d550: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20  .  ** and there 
d560: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
d570: 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  then return SQLI
d580: 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75  TE_BUSY. If a fu
d590: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62  nction.  ** is b
d5a0: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f  eing overridden/
d5b0: 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72  deleted but ther
d5c0: 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
d5d0: 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20  VMs, allow the. 
d5e0: 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f   ** operation to
d5f0: 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e   continue but in
d600: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
d610: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
d620: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  nts..  */.  p = 
d630: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
d640: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
d650: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
d660: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b  rg, (u8)enc, 0);
d670: 0a 20 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e  .  if( p && (p->
d680: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
d690: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
d6a0: 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67  ==enc && p->nArg
d6b0: 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  ==nArg ){.    if
d6c0: 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
d6d0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
d6e0: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
d6f0: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
d700: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
d710: 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
d720: 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20  y user-function 
d730: 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
d740: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
d750: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
d760: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
d770: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d780: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
d790: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
d7a0: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
d7b0: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
d7c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20     }.  }..  p = 
d7d0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
d7e0: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
d7f0: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
d800: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b  rg, (u8)enc, 1);
d810: 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64  .  assert(p || d
d820: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
d830: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
d840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d850: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
d860: 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72   If an older ver
d870: 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63  sion of the func
d880: 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66  tion with a conf
d890: 69 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f  igured destructo
d8a0: 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20  r is.  ** being 
d8b0: 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20  replaced invoke 
d8c0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
d8d0: 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f  unction here. */
d8e0: 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72  .  functionDestr
d8f0: 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66  oy(db, p);..  if
d900: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
d910: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
d920: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
d930: 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d  p->pDestructor =
d940: 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20   pDestructor;.  
d950: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28  p->funcFlags = (
d960: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
d970: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
d980: 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73  SK) | extraFlags
d990: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d  ;.  testcase( p-
d9a0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
d9b0: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
d9c0: 43 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20  C );.  p->xFunc 
d9d0: 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53  = xFunc;.  p->xS
d9e0: 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70  tep = xStep;.  p
d9f0: 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46  ->xFinalize = xF
da00: 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72  inal;.  p->pUser
da10: 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61  Data = pUserData
da20: 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75  ;.  p->nArg = (u
da30: 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72  16)nArg;.  retur
da40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
da50: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77  /*.** Create new
da60: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
da70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
da80: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
da90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
daa0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
dab0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
dac0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
dad0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
dae0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
daf0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
db00: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
db10: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
db20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
db30: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
db40: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
db50: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
db60: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72  context*).){.  r
db70: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
db80: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
db90: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
dba0: 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c  , enc, p, xFunc,
dbb0: 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20   xStep,.        
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e              xFin
dbe0: 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73  al, 0);.}..int s
dbf0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
dc00: 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  nction_v2(.  sql
dc10: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
dc20: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
dc30: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
dc40: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
dc50: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
dc60: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
dc70: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
dc80: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
dc90: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
dca0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
dcb0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
dcc0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
dcd0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
dce0: 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  t*),.  void (*xD
dcf0: 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a  estroy)(void *).
dd00: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
dd10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75  LITE_ERROR;.  Fu
dd20: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41  ncDestructor *pA
dd30: 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  rg = 0;..#ifdef 
dd40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
dd50: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
dd60: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
dd70: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
dd80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
dd90: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
dda0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ddb0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ddc0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
ddd0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
dde0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
ddf0: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
de00: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
de10: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
de20: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
de30: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
de40: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
de50: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
de60: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
de70: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
de80: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
de90: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
dea0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
deb0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
dec0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
ded0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
dee0: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
def0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
df00: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
df10: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
df20: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
df30: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
df40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
df50: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
df60: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
df70: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
df80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
df90: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
dfa0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
dfb0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
dfc0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
dfd0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
dfe0: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
dff0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e000: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
e010: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
e020: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
e030: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
e040: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
e050: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e060: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e070: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
e080: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
e090: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e0a0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
e0b0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
e0c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
e0d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
e0e0: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66  ar *zFunc8;..#if
e0f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e100: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
e110: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
e120: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
e130: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
e140: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
e150: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
e160: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
e170: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e180: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
e190: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e1a0: 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20  d );.  zFunc8 = 
e1b0: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
e1c0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
e1d0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
e1e0: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63  F16NATIVE);.  rc
e1f0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
e200: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
e210: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
e220: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
e230: 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73  , xFinal,0);.  s
e240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e250: 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
e260: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e270: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e280: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e290: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e2a0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e2b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  .../*.** Declare
e2c0: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
e2d0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f   has been overlo
e2e0: 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61  aded by a virtua
e2f0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
e300: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61  f the function a
e310: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73  lready exists as
e320: 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61   a regular globa
e330: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  l function, then
e340: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
e350: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
e360: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
e370: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
e380: 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e  en create.** a n
e390: 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61  ew one that alwa
e3a0: 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d  ys throws a run-
e3b0: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a  time error.  .**
e3c0: 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c  .** When virtual
e3d0: 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74   tables intend t
e3e0: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65  o provide an ove
e3f0: 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e  rloaded function
e400: 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  , they.** should
e410: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
e420: 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
e430: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
e440: 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41  ion exists..** A
e450: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
e460: 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f   must exist in o
e470: 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65  rder for name re
e480: 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  solution to work
e490: 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  .** properly..*/
e4a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65  .int sqlite3_ove
e4b0: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a  rload_function(.
e4c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
e4d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
e4e0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29  me,.  int nArg.)
e4f0: 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  {.  int nName = 
e500: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e510: 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63  zName);.  int rc
e520: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
e530: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e540: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e550: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
e560: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
e570: 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72   zName==0 || nAr
e580: 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  g<-2 ){.    retu
e590: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e5a0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
e5b0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
e5c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
e5d0: 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
e5e0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
e5f0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
e600: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
e610: 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  8, 0)==0 ){.    
e620: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
e630: 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65  teFunc(db, zName
e640: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
e650: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TF8,.           
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  0, sqlite3Invali
e680: 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  dFunction, 0, 0,
e690: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   0);.  }.  rc = 
e6a0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
e6b0: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
e6c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
e6d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
e6e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
e6f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
e700: 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ACE./*.** Regist
e710: 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74  er a trace funct
e720: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
e730: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
e740: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72  ly registered tr
e750: 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ace.** is return
e760: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
e770: 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f  LL trace functio
e780: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
e790: 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75  tracing is execu
e7a0: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
e7b0: 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70  .** trace is a p
e7c0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
e7d0: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
e7e0: 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72  oked at the star
e7f0: 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c  t of each.** SQL
e800: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
e810: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61  oid *sqlite3_tra
e820: 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ce(sqlite3 *db, 
e830: 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28 76  void (*xTrace)(v
e840: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
e850: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
e860: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
e870: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e880: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e890: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
e8a0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
e8b0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
e8c0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e8d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e8e0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
e8f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e900: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
e910: 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67   = db->pTraceArg
e920: 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
e930: 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
e940: 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
e950: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e960: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
e970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
e980: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ;.}./*.** Regist
e990: 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
e9a0: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
e9b0: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
e9c0: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
e9d0: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
e9e0: 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
e9f0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
ea00: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
ea10: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
ea20: 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
ea30: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
ea40: 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
ea50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
ea60: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
ea70: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
ea80: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
ea90: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
eaa0: 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
eab0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
eac0: 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
ead0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
eae0: 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
eaf0: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
eb00: 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
eb10: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
eb20: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69   void *pOld;..#i
eb30: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eb40: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
eb50: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
eb60: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
eb70: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
eb80: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
eb90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
eba0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
ebb0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ebc0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
ebd0: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
ebe0: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
ebf0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
ec00: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
ec10: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
ec20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
ec30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ec40: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
ec50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ec60: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
ec70: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
ec80: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
ec90: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
eca0: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
ecb0: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
ecc0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
ecd0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
ece0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
ecf0: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
ed00: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
ed10: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
ed20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ed40: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
ed50: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
ed60: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
ed70: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
ed80: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
ed90: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
eda0: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
edb0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
edc0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
edd0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
ede0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
edf0: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
ee00: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
ee10: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
ee20: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
ee30: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
ee40: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
ee50: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
ee60: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
ee70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ee80: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ee90: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f    pOld = db->pCo
eea0: 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78  mmitArg;.  db->x
eeb0: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d  CommitCallback =
eec0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
eed0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70  ->pCommitArg = p
eee0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
eef0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ef00: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ef10: 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pOld;.}../*.** R
ef20: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
ef30: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
ef40: 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
ef50: 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
ef60: 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
ef70: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
ef80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ef90: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
efa0: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
efb0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
efd0: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
efe0: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
eff0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
f000: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
f010: 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c  nt,char const *,
f020: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c  char const *,sql
f030: 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  ite_int64),.  vo
f040: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
f050: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
f060: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
f070: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
f080: 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20   *pRet;..#ifdef 
f090: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f0a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f0b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f0c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
f0d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
f0e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
f0f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
f100: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f110: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f120: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
f130: 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
f140: 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
f150: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
f160: 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
f170: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
f180: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f190: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f1a0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
f1b0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
f1c0: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
f1d0: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
f1e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f1f0: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
f200: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
f210: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
f220: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
f230: 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
f240: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
f250: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
f260: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
f270: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
f280: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
f290: 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
f2a0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
f2b0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f2d0: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
f2e0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
f2f0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a  .  void *pRet;..
f300: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f310: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
f320: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
f330: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
f340: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
f350: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f360: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f370: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
f380: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f390: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
f3a0: 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
f3b0: 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
f3c0: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
f3d0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
f3e0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
f3f0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
f400: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f410: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f420: 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
f430: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
f440: 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  L./*.** The sqli
f450: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
f460: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
f470: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61  ed by sqlite3_wa
f480: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
f490: 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71  ()..** Invoke sq
f4a0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
f4b0: 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62  oint if the numb
f4c0: 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20  er of frames in 
f4d0: 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20  the log file.** 
f4e0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
f4f0: 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20  sqlite3.pWalArg 
f500: 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
f510: 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f  er (the value co
f520: 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77  nfigured by.** w
f530: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
f540: 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  t())..*/ .int sq
f550: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
f560: 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  ook(.  void *pCl
f570: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a  ientData,     /*
f580: 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73   Argument */.  s
f590: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
f5a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
f5b0: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
f5c0: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
f5d0: 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  /* Database */. 
f5e0: 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20   int nFrame     
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f600: 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69  of WAL */.){.  i
f610: 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54  f( nFrame>=SQLIT
f620: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c  E_PTR_TO_INT(pCl
f630: 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20  ientData) ){.   
f640: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
f650: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
f660: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
f670: 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29  ckpoint(db, zDb)
f680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
f690: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
f6a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
f6b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
f6c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f6d0: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  WAL */../*.** Co
f6e0: 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74  nfigure an sqlit
f6f0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
f700: 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61  llback to automa
f710: 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
f720: 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  nt.** a database
f730: 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e   after committin
f740: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
f750: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72  if there are nFr
f760: 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66  ame or.** more f
f770: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
f780: 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a   file. Passing z
f790: 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76  ero or a negativ
f7a0: 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a  e value as the.*
f7b0: 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74  * nFrame paramet
f7c0: 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f  er disables auto
f7d0: 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
f7e0: 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a  s entirely..**.*
f7f0: 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  * The callback r
f800: 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69  egistered by thi
f810: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61  s function repla
f820: 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ces any existing
f830: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67   callback.** reg
f840: 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71  istered using sq
f850: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
f860: 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69  . Likewise, regi
f870: 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61  stering a callba
f880: 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  ck.** using sqli
f890: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64  te3_wal_hook() d
f8a0: 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f  isables the auto
f8b0: 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
f8c0: 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f   mechanism.** co
f8d0: 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73  nfigured by this
f8e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
f8f0: 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  t sqlite3_wal_au
f900: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  tocheckpoint(sql
f910: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
f920: 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51  rame){.#ifdef SQ
f930: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
f940: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
f950: 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (db);.  UNUSED_P
f960: 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29  ARAMETER(nFrame)
f970: 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53  ;.#else.#ifdef S
f980: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f990: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f9a0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f9b0: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
f9c0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f9d0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
f9e0: 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20   nFrame>0 ){.   
f9f0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
fa00: 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c  k(db, sqlite3Wal
fa10: 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c  DefaultHook, SQL
fa20: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
fa30: 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  Frame));.  }else
fa40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
fa50: 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29  l_hook(db, 0, 0)
fa60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
fa70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fa80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
fa90: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
faa0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
fab0: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
fac0: 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ion is written.*
fad0: 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65  * into the write
fae0: 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68  -ahead-log by th
faf0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
fb00: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
fb10: 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f  *sqlite3_wal_hoo
fb20: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
fb30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fb40: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
fb50: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
fb60: 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
fb70: 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
fb80: 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
fb90: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
fba0: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
fbd0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
fbe0: 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
fbf0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
fc00: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f  TE_OMIT_WAL.  vo
fc10: 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66  id *pRet;.#ifdef
fc20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
fc30: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
fc40: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fc50: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
fc60: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
fc70: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
fc80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
fc90: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
fca0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
fcb0: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
fcc0: 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d  ->pWalArg;.  db-
fcd0: 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20  >xWalCallback = 
fce0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
fcf0: 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b  >pWalArg = pArg;
fd00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fd10: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
fd20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
fd30: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
fd40: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
fd50: 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
fd60: 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a  atabase zDb..*/.
fd70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
fd80: 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20  checkpoint_v2(. 
fd90: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdb0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
fdc0: 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
fdd0: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
fde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
fdf0: 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
fe00: 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20  abase (or NULL) 
fe10: 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20  */.  int eMode, 
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43       /* SQLITE_C
fe40: 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75  HECKPOINT_* valu
fe50: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f  e */.  int *pnLo
fe60: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
fe70: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
fe80: 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69  ize of WAL log i
fe90: 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  n frames */.  in
fea0: 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20  t *pnCkpt       
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fec0: 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62   OUT: Total numb
fed0: 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65  er of frames che
fee0: 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a  ckpointed */.){.
fef0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ff00: 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20  IT_WAL.  return 
ff10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
ff20: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
ff50: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  e */.  int iDb =
ff60: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
ff70: 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65  CHED;  /* sqlite
ff80: 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66  3.aDb[] index of
ff90: 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e   db to checkpoin
ffa0: 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  t */..#ifdef SQL
ffb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
ffc0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
ffd0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
ffe0: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
fff0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10000 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
10010 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75  nitialize the ou
10020 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74  tput variables t
10030 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20  o -1 in case an 
10040 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
10050 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a  .  if( pnLog ) *
10060 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66  pnLog = -1;.  if
10070 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b  ( pnCkpt ) *pnCk
10080 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65  pt = -1;..  asse
10090 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
100a0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30  POINT_PASSIVE==0
100b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
100c0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
100d0 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  FULL==1 );.  ass
100e0 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
100f0 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d  KPOINT_RESTART==
10100 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
10110 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10120 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
10130 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49    if( eMode<SQLI
10140 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
10150 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53  SSIVE || eMode>S
10160 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10170 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
10180 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10190 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54   R-03996-12088 T
101a0 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d  he M parameter m
101b0 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 63  ust be a valid c
101c0 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a  heckpoint.    **
101d0 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65   mode: */.    re
101e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
101f0 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
10200 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10210 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
10220 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
10230 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
10240 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
10250 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
10260 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
10270 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
10280 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
10290 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
102a0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
102b0 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
102c0 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
102d0 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48  e{.    db->busyH
102e0 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
102f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
10300 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
10310 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c   iDb, eMode, pnL
10320 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
10330 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
10340 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20  , rc);.  }.  rc 
10350 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
10360 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
10370 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10380 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10390 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
103a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  }.../*.** Checkp
103b0 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
103c0 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c  b. If zDb is NUL
103d0 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66  L, or if the buf
103e0 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a  fer zDb points.*
103f0 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20  * to contains a 
10400 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69  zero-length stri
10410 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64  ng, all attached
10420 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a   databases are .
10430 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
10440 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
10450 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73  wal_checkpoint(s
10460 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
10470 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
10480 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
10490 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54 68  R-41613-20553 Th
104a0 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
104b0 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69 73  eckpoint(D,X) is
104c0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
104d0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   ** sqlite3_wal_
104e0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c  checkpoint_v2(D,
104f0 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  X,SQLITE_CHECKPO
10500 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29  INT_PASSIVE,0,0)
10510 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71  . */.  return sq
10520 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
10530 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53  oint_v2(db,zDb,S
10540 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10550 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d  _PASSIVE,0,0);.}
10560 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10570 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
10580 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
10590 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
105a0 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
105b0 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
105c0 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
105d0 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
105e0 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
105f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
10600 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
10610 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
10620 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
10630 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
10640 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
10650 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
10660 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
10670 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
10680 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
10690 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
106a0 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
106b0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
106c0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
106d0 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
106e0 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
106f0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
10700 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
10710 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
10720 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
10730 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
10740 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
10750 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10760 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
10770 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
10780 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
10790 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
107a0 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
107b0 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
107c0 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
107d0 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
107e0 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
107f0 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
10800 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
10810 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
10820 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
10830 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
10840 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
10850 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
10860 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
10870 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
10880 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
10890 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  s..**.** Paramet
108a0 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20  er eMode is one 
108b0 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
108c0 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
108d0 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a  LL or RESTART..*
108e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
108f0 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
10900 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
10910 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  t eMode, int *pn
10920 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74  Log, int *pnCkpt
10930 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10940 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
10950 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10960 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
10990 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
109a0 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
109b0 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20   */.  int bBusy 
109c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
109d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
109e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73   SQLITE_BUSY has
109f0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
10a00 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
10a10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10a20 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
10a30 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f  .  assert( !pnLo
10a40 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20  g || *pnLog==-1 
10a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
10a60 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d  Ckpt || *pnCkpt=
10a70 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  =-1 );..  for(i=
10a80 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20  0; i<db->nDb && 
10a90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
10aa0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
10ab0 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49  iDb || iDb==SQLI
10ac0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
10ad0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
10ae0 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70  lite3BtreeCheckp
10af0 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  oint(db->aDb[i].
10b00 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  pBt, eMode, pnLo
10b10 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
10b20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20    pnLog = 0;.   
10b30 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20     pnCkpt = 0;. 
10b40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
10b50 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
10b60 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20      bBusy = 1;. 
10b70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
10b80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
10b90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
10ba0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
10bb0 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51  K && bBusy) ? SQ
10bc0 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a  LITE_BUSY : rc;.
10bd0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10be0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
10bf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10c00 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65  ion returns true
10c10 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   if main-memory 
10c20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69  should be used i
10c30 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74  nstead of.** a t
10c40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f  emporary file fo
10c50 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65  r transient page
10c60 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74  r files and stat
10c70 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  ement journals..
10c80 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
10c90 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  urned depends on
10ca0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62   the value of db
10cb0 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75  ->temp_store (ru
10cc0 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74  ntime.** paramet
10cd0 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  er) and the comp
10ce0 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
10cf0 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
10d00 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ORE. The.** foll
10d10 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
10d20 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69  ribes the relati
10d30 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74  onship between t
10d40 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a  hese two values.
10d50 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ** and this func
10d60 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c  tions return val
10d70 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49  ue..**.**   SQLI
10d80 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20  TE_TEMP_STORE   
10d90 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
10da0 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
10db0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
10dc0 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ase.**   -------
10dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
10de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
10df0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
10e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e10 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
10e20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
10e40 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
10e50 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
10e90 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
10ec0 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
10ed0 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31  return 1).**   1
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
10f00 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
10f10 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
10f20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
10f30 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
10f40 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
10f50 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
10f60 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
10f70 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
10f90 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
10fa0 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  1).**   2       
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
10fe0 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20  rn 1).**   3    
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
11010 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
11020 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20  eturn 1).*/.int 
11030 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
11040 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65  ory(const sqlite
11050 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49  3 *db){.#if SQLI
11060 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31  TE_TEMP_STORE==1
11070 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
11080 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b  temp_store==2 );
11090 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
110a0 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
110b0 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
110c0 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b  temp_store!=1 );
110d0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
110e0 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
110f0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
11100 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
11110 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53  EMP_STORE<1 || S
11120 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11130 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  >3.  return 0;.#
11140 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
11150 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
11160 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
11170 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
11180 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
11190 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
111a0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
111b0 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
111c0 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
111d0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
111e0 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
111f0 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
11200 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
11210 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
11220 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
11230 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
11240 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
11250 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
11260 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  USE_BKPT);.  }. 
11270 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11280 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11290 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
112a0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
112b0 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
112c0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
112d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73    }else{.    tes
112e0 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d  tcase( db->pErr=
112f0 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63  =0 );.    z = (c
11300 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
11310 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72  ue_text(db->pErr
11320 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
11330 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11340 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30   );.    if( z==0
11350 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
11360 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
11370 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  errCode);.    }.
11380 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
11390 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
113a0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
113b0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
113c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
113d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
113e0 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  16 encoded Engli
113f0 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
11400 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
11410 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
11420 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  ror..*/.const vo
11430 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  id *sqlite3_errm
11440 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62  sg16(sqlite3 *db
11450 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
11460 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d  t u16 outOfMem[]
11470 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75   = {.    'o', 'u
11480 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27  ', 't', ' ', 'o'
11490 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c  , 'f', ' ', 'm',
114a0 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20   'e', 'm', 'o', 
114b0 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b  'r', 'y', 0.  };
114c0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
114d0 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b  u16 misuse[] = {
114e0 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27  .    'l', 'i', '
114f0 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72  b', 'r', 'a', 'r
11500 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'y', ' ', .  
11510 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c    'r', 'o', 'u',
11520 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20   't', 'i', 'n', 
11530 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'e', ' ', .    '
11540 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c  c', 'a', 'l', 'l
11550 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27  ', 'e', 'd', ' '
11560 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c  , .    'o', 'u',
11570 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   't', ' ', .    
11580 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a  'o', 'f', ' ', .
11590 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71      's', 'e', 'q
115a0 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27  ', 'u', 'e', 'n'
115b0 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20  , 'c', 'e', 0.  
115c0 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  };..  const void
115d0 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
115e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
115f0 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
11600 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
11610 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
11620 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
11630 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d  return (void *)m
11640 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  isuse;.  }.  sql
11650 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11660 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
11670 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
11680 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28  led ){.    z = (
11690 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
116a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
116b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
116c0 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
116d0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
116e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
116f0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
11700 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c  db->errCode, sql
11710 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
11720 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  rrCode));.      
11730 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
11740 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
11750 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
11760 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
11770 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
11780 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
11790 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
117a0 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
117b0 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
117c0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
117d0 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
117e0 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
117f0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
11800 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
11810 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
11820 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
11830 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
11840 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
11850 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
11860 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
11870 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
11880 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62  e..    */.    db
11890 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
118a0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
118b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
118c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
118d0 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
118e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
118f0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
11900 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
11910 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
11920 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
11930 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20  SQLite routine. 
11940 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61  If NULL is.** pa
11950 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
11960 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65  ction, we assume
11970 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
11980 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  ed during sqlite
11990 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  3_open()..*/.int
119a0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
119b0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
119c0 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
119d0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
119e0 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
119f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11a00 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
11a10 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
11a20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11a30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11a40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
11a50 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
11a60 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
11a70 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  k;.}.int sqlite3
11a80 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
11a90 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
11aa0 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
11ab0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
11ac0 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
11ad0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11ae0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
11af0 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
11b00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11b10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11b20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11b30 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
11b40 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Code;.}../*.** R
11b50 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
11b60 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
11b70 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
11b80 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
11b90 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46  .** argument.  F
11ba0 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d  or now, this sim
11bb0 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e  ply calls the in
11bc0 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72  ternal sqlite3Er
11bd0 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rStr().** functi
11be0 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
11bf0 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74  r *sqlite3_errst
11c00 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74  r(int rc){.  ret
11c10 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
11c20 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r(rc);.}../*.** 
11c30 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
11c40 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
11c50 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
11c60 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
11c70 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
11c80 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
11c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ca0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
11cb0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a  .  sqlite3* db,.
11cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
11cd0 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a  ame, .  u8 enc,.
11ce0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
11cf0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
11d00 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
11d10 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
11d20 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
11d30 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
11d40 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11d50 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a  .  int enc2;.  .
11d60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11d70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
11d80 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
11d90 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
11da0 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
11db0 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
11dc0 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
11dd0 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
11de0 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
11df0 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
11e00 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
11e10 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
11e20 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
11e30 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
11e40 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
11e50 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65  .  */.  enc2 = e
11e60 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  nc;.  testcase( 
11e70 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
11e80 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  16 );.  testcase
11e90 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
11ea0 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a  TF16_ALIGNED );.
11eb0 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49    if( enc2==SQLI
11ec0 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32  TE_UTF16 || enc2
11ed0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
11ee0 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e  LIGNED ){.    en
11ef0 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  c2 = SQLITE_UTF1
11f00 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69  6NATIVE;.  }.  i
11f10 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55  f( enc2<SQLITE_U
11f20 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49  TF8 || enc2>SQLI
11f30 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20  TE_UTF16BE ){.  
11f40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11f50 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
11f60 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
11f70 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d  this call is rem
11f80 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69  oving or replaci
11f90 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63  ng an existing c
11fa0 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73  ollation .  ** s
11fb0 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20  equence. If so, 
11fc0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
11fd0 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e  tive VMs, return
11fe0 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a   busy. If there.
11ff0 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69    ** are no acti
12000 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61  ve VMs, invalida
12010 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69  te any pre-compi
12020 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
12030 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    */.  pColl = s
12040 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
12050 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
12060 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  zName, 0);.  if(
12070 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
12080 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28  >xCmp ){.    if(
12090 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
120a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
120b0 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
120c0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
120d0 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
120e0 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
120f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12100 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76  nce due to activ
12110 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
12120 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12130 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
12140 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
12150 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
12160 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nts(db);..    /*
12170 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
12180 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
12190 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
121a0 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
121b0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
121c0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
121d0 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
121e0 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
121f0 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
12200 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
12210 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
12220 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
12230 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
12240 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
12250 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
12260 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
12270 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
12280 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
12290 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
122a0 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
122b0 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
122c0 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
122d0 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
122e0 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
122f0 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
12300 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
12310 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
12320 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
12330 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
12340 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
12350 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
12360 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
12370 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
12380 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
12390 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
123a0 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
123b0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
123c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
123d0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
123e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
123f0 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
12400 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
12410 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
12420 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
12430 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
12440 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12450 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
12460 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
12470 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
12480 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
12490 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
124a0 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
124b0 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
124c0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
124d0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
124e0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
124f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12500 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
12510 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
12520 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
12530 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
12540 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
12550 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
12560 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
12570 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
12580 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
12590 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
125a0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
125b0 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
125c0 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
125d0 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
125e0 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
125f0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
12600 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
12610 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
12620 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
12630 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
12640 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
12650 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
12660 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
12670 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
12680 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
12690 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
126a0 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
126b0 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
126c0 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d  MBER,      /* IM
126d0 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32  P: R-38091-32352
126e0 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58   */.  SQLITE_MAX
126f0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a  _TRIGGER_DEPTH,.
12700 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52    SQLITE_MAX_WOR
12710 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a  KER_THREADS,.};.
12720 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
12730 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
12740 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
12750 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
12760 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12770 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
12780 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
12790 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
127a0 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
127b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
127c0 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
127d0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
127e0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
127f0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
12800 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
12810 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
12820 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
12830 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
12840 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
12850 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
12860 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
12870 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
12880 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12890 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
128a0 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
128b0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
128c0 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
128d0 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
128e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
128f0 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
12900 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
12910 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
12920 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
12930 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
12940 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
12950 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
12960 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30  UNCTION_ARG>1000
12970 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
12980 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
12990 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
129a0 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64   0 and 1000.#end
129b0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
129c0 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
129d0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
129e0 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20  HED>125.# error 
129f0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
12a00 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77  HED must be betw
12a10 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65  een 0 and 125.#e
12a20 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12a30 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
12a40 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f  _LENGTH<1.# erro
12a50 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  r SQLITE_MAX_LIK
12a60 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
12a70 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
12a80 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
12a90 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
12aa0 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
12ab0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
12ac0 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
12ad0 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69   32767.#endif.#i
12ae0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  f SQLITE_MAX_TRI
12af0 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65  GGER_DEPTH<1.# e
12b00 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
12b10 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75  TRIGGER_DEPTH mu
12b20 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
12b30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
12b40 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
12b50 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54  READS<0 || SQLIT
12b60 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
12b70 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20  EADS>50.# error 
12b80 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
12b90 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62  R_THREADS must b
12ba0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
12bb0 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  50.#endif.../*.*
12bc0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
12bd0 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
12be0 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
12bf0 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
12c00 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
12c10 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
12c20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
12c30 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
12c40 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
12c50 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
12c60 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
12c70 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
12c80 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
12c90 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
12ca0 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
12cb0 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
12cc0 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
12cd0 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
12ce0 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
12cf0 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
12d00 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
12d10 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
12d20 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
12d30 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
12d40 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
12d50 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  mit;..#ifdef SQL
12d60 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
12d70 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
12d80 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
12d90 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
12da0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
12db0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
12dc0 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
12dd0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
12de0 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
12df0 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
12e00 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
12e10 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
12e20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
12e30 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
12e40 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
12e50 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
12e60 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
12e70 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
12e80 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
12e90 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
12ea0 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
12eb0 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
12ec0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
12ed0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
12ee0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
12ef0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
12f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
12f10 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
12f20 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
12f30 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
12f40 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
12f50 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
12f60 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
12f70 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
12f80 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
12f90 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
12fa0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
12fb0 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
12fc0 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
12fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
12fe0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
12ff0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
13000 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
13010 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
13020 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
13030 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13040 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
13050 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
13060 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
13070 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13080 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
13090 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
130a0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
130b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
130c0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
130d0 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
130e0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
130f0 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
13100 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13110 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
13120 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13160 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
13170 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
13180 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13190 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
131a0 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
131b0 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
131c0 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
131d0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
131e0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
131f0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
13200 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
13210 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
13220 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
13230 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
13240 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
13250 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  ]==SQLITE_MAX_WO
13260 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a  RKER_THREADS );.
13270 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
13280 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
13290 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e  READS==(SQLITE_N
132a0 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
132b0 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
132c0 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
132d0 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
132e0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
132f0 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
13300 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
13310 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
13320 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
13330 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
13340 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
13350 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
13360 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
13370 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
13380 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
13390 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
133a0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
133b0 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
133c0 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
133d0 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
133e0 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
133f0 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13410 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
13420 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
13430 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
13440 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
13450 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
13460 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
13470 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
13480 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
13490 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
134a0 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
134b0 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
134c0 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
134d0 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
134e0 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
134f0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
13500 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
13510 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
13520 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
13530 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
13540 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
13550 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
13560 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
13570 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
13580 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
13590 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
135a0 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
135b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
135c0 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
135d0 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
135e0 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
135f0 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
13600 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
13610 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
13620 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
13630 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
13640 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
13650 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13660 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
13670 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
13680 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
13690 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
136a0 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
136b0 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
136c0 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
136d0 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
136e0 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
136f0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
13700 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
13710 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
13720 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
13730 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
13740 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
13750 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
13760 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
13770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13780 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
13790 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
137a0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
137b0 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
137c0 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
137d0 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
137e0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
137f0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
13800 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
13810 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
13820 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
13830 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
13840 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13850 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
13860 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
13870 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
13880 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
13890 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
138a0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
138b0 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
138c0 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
138d0 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
138e0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
138f0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
13900 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
13910 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
13920 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
13930 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
13940 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
13950 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
13960 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
13970 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
13980 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
13990 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
139a0 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
139b0 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
139d0 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
139e0 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
139f0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
13a00 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
13a10 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
13a20 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
13a30 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
13a40 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
13a50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
13a60 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
13a70 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
13aa0 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
13ab0 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
13ac0 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
13ad0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
13ae0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
13af0 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
13b00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13b10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
13b20 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
13b30 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
13b40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
13b50 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
13b60 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
13b70 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
13b80 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
13b90 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
13ba0 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
13bb0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
13bc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
13bd0 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20  PEN_URI)        
13be0 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
13bf0 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20  8725-32206 */.  
13c00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
13c10 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13c20 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d  .bOpenUri) /* IM
13c30 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38  P: R-51689-46548
13c40 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d   */.   && nUri>=
13c50 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69  5 && memcmp(zUri
13c60 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30  , "file:", 5)==0
13c70 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34   /* IMP: R-57884
13c80 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20  -37496 */.  ){. 
13c90 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
13ca0 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
13cd0 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
13ce0 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
13cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13d00 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
13d10 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
13d20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
13d30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13d40 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
13d50 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
13d60 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
13d70 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
13d80 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
13d90 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
13da0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
13db0 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
13dc0 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
13dd0 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
13de0 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
13df0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
13e00 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
13e10 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
13e20 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
13e30 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
13e40 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
13e50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
13e60 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
13e70 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
13e80 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
13e90 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
13ea0 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
13eb0 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
13ec0 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
13ed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13ee0 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d  OMEM;..    iIn =
13ef0 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   5;.#ifdef SQLIT
13f00 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
13f10 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20 73 74  ORITY.    if( st
13f20 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f  rncmp(zUri+5, "/
13f30 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  //", 3)==0 ){.  
13f40 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
13f50 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
13f60 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61  ing condition ca
13f70 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66  uses URIs with f
13f80 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68  ive leading / ch
13f90 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a  aracters.      *
13fa0 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f  * like file:////
13fb0 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65  /host/path to be
13fc0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
13fd0 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74  UNCs like //host
13fe0 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  /path..      ** 
13ff0 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20  The correct URI 
14000 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73  for that UNC has
14010 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75   only two or fou
14020 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72  r leading / char
14030 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  acters.      ** 
14040 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68  file://host/path
14050 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73   or file:////hos
14060 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c  t/path.  But 5 l
14070 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69  eading slashes i
14080 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  s a .      ** co
14090 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61  mmon error, we a
140a0 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68  re told, so we h
140b0 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70  andle it as a sp
140c0 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20  ecial case. */. 
140d0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
140e0 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20  (zUri+7, "///", 
140f0 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20  3)==0 ){ iIn++; 
14100 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
14110 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20  strncmp(zUri+5, 
14120 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20  "//localhost/", 
14130 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  12)==0 ){.      
14140 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a  iIn = 16;.    }.
14150 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73  #else.    /* Dis
14160 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
14170 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
14180 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
14190 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
141a0 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
141b0 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
141c0 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
141d0 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
141e0 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
141f0 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
14200 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
14210 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
14220 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
14230 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
14240 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
14250 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
14260 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
14270 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
14280 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
14290 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
142a0 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
142b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
142c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
142d0 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
142e0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
142f0 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
14300 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
14310 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
14320 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
14330 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
14340 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
14350 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
14360 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
14370 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
14380 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
14390 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
143a0 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
143b0 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
143c0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
143d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
143e0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
143f0 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
14400 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
14410 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
14420 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
14430 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
14440 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
14450 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
14460 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
14470 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
14480 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
14490 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
144a0 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
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 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
144e0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
144f0 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
14500 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
14510 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
14520 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
14530 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
14540 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
14550 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
14560 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
14570 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
14580 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
14590 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
145a0 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
145b0 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
145c0 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
145d0 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
145e0 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
145f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14600 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14610 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25  is taken when "%
14620 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68  00" appears with
14630 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74  in the URI. In t
14640 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
14650 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20   case we ignore 
14660 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20  all text in the 
14670 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
14680 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20   path, name or. 
14690 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
146a0 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
146b0 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e  g parsed. So ign
146c0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
146d0 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20  character.      
146e0 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20      ** and skip 
146f0 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c  to the next "?",
14700 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20   "=" or "&", as 
14710 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a  appropriate. */.
14720 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
14730 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
14740 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20  !=0 && c!='#' . 
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
14760 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21  (eState!=0 || c!
14770 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='?').          
14780 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
14790 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20  1 || (c!='=' && 
147a0 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20  c!='&')).       
147b0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
147c0 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a  e!=2 || c!='&').
147d0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
147e0 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a           iIn++;.
147f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14800 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
14810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14820 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20    c = octet;.   
14830 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
14840 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26  ate==1 && (c=='&
14850 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a  ' || c=='=') ){.
14860 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
14870 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a  e[iOut-1]==0 ){.
14880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
14890 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d  empty option nam
148a0 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f  e. Ignore this o
148b0 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72  ption altogether
148c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
148d0 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
148e0 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23  && zUri[iIn]!='#
148f0 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d  ' && zUri[iIn-1]
14900 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='&' ) iIn++;. 
14910 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
14920 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
14930 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20       if( c=='&' 
14940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69  ){.          zFi
14950 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
14960 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ';.        }else
14970 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
14980 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
14990 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  }.        c = 0;
149a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
149b0 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63   (eState==0 && c
149c0 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74  =='?') || (eStat
149d0 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20  e==2 && c=='&') 
149e0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30  ){.        c = 0
149f0 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  ;.        eState
14a00 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
14a10 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
14a20 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = c;.    }.   
14a30 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29   if( eState==1 )
14a40 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
14a50 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
14a60 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
14a70 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
14a80 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  +] = '\0';..    
14a90 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72  /* Check if ther
14aa0 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f  e were any optio
14ab0 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61  ns specified tha
14ac0 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65  t should be inte
14ad0 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20  rpreted .    ** 
14ae0 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68  here. Options th
14af0 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74  at are interpret
14b00 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20  ed here include 
14b10 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20  "vfs" and those 
14b20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72  that.    ** corr
14b30 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20  espond to flags 
14b40 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73  that may be pass
14b50 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
14b60 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20  3_open_v2().    
14b70 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20  ** method. */.  
14b80 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b    zOpt = &zFile[
14b90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14ba0 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77  zFile)+1];.    w
14bb0 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b  hile( zOpt[0] ){
14bc0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20  .      int nOpt 
14bd0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
14be0 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63  0(zOpt);.      c
14bf0 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70  har *zVal = &zOp
14c00 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20  t[nOpt+1];.     
14c10 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
14c20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c  te3Strlen30(zVal
14c30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  );..      if( nO
14c40 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28  pt==3 && memcmp(
14c50 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d  "vfs", zOpt, 3)=
14c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56  =0 ){.        zV
14c70 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20  fs = zVal;.     
14c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14c90 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
14ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
14cb0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
14cc0 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20       int mode;. 
14cd0 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20         } *aMode 
14ce0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
14cf0 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30  r *zModeType = 0
14d00 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61  ;.        int ma
14d10 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
14d20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a  int limit = 0;..
14d30 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
14d40 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63  ==5 && memcmp("c
14d50 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d  ache", zOpt, 5)=
14d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14d70 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
14d80 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64  enMode aCacheMod
14d90 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
14da0 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20      { "shared", 
14db0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
14dc0 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
14dd0 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61          { "priva
14de0 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  te", SQLITE_OPEN
14df0 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
14e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
14e10 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
14e20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
14e30 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
14e40 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c  _SHAREDCACHE|SQL
14e50 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
14e60 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20  CACHE;.         
14e70 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d   aMode = aCacheM
14e80 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
14e90 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20  imit = mask;.   
14ea0 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
14eb0 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20   = "cache";.    
14ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14ed0 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d  ( nOpt==4 && mem
14ee0 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74  cmp("mode", zOpt
14ef0 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
14f00 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
14f10 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65  ct OpenMode aOpe
14f20 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  nMode[] = {.    
14f30 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20          { "ro", 
14f40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
14f50 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20  DONLY },.       
14f60 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51       { "rw",  SQ
14f70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
14f80 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20  ITE }, .        
14f90 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c      { "rwc", SQL
14fa0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
14fb0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
14fc0 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
14fd0 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79         { "memory
14fe0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
14ff0 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20  EMORY },.       
15000 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
15010 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
15020 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
15030 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
15040 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y | SQLITE_OPEN_
15050 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20  READWRITE.      
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
15070 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
15080 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
15090 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20  MEMORY;.        
150a0 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d    aMode = aOpenM
150b0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
150c0 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c  imit = mask & fl
150d0 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ags;.          z
150e0 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65  ModeType = "acce
150f0 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ss";.        }..
15100 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64          if( aMod
15110 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
15120 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
15130 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  int mode = 0;.  
15140 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
15150 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b   aMode[i].z; i++
15160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
15170 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
15180 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20  Mode[i].z;.     
15190 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d         if( nVal=
151a0 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
151b0 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  (z) && 0==memcmp
151c0 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20  (zVal, z, nVal) 
151d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
151e0 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d   mode = aMode[i]
151f0 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  .mode;.         
15200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15230 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20  if( mode==0 ){. 
15240 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
15250 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
15260 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
15270 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d  %s mode: %s", zM
15280 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
15290 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
152a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
152b0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
152c0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
152d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
152e0 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26       if( (mode &
152f0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45   ~SQLITE_OPEN_ME
15300 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20  MORY)>limit ){. 
15310 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
15320 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
15330 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
15340 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
15350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
15380 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
15390 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
153a0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
153b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
153c0 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
153d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
153e0 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
153f0 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
15400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15410 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
15420 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
15430 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
15440 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
15450 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32  e3_malloc(nUri+2
15460 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
15470 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
15480 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
15490 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c  cpy(zFile, zUri,
154a0 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c   nUri);.    zFil
154b0 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
154c0 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
154d0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
154e0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
154f0 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
15500 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
15510 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
15520 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
15530 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
15540 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
15550 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
15560 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
15570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15580 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
15590 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
155a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
155b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
155c0 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
155d0 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
155e0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
155f0 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
15600 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15610 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
15620 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
15630 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
15640 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
15650 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
15660 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
15670 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
15680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15690 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
156a0 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
156b0 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
156c0 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
156d0 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
156e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
156f0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
15700 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
15710 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
15720 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
15730 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
15740 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
15750 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
15760 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
15770 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
15780 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15790 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
157a0 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
157b0 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
157c0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
157d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
157e0 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
157f0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
15800 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
15830 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
15840 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
15850 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
15860 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
15870 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
15880 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
15890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
158a0 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
158b0 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
158c0 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
158d0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
158f0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
15900 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
15910 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ri() */..#ifdef 
15920 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
15930 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
15940 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
15950 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
15960 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
15970 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
15980 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
15990 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
159a0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
159b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
159c0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
159d0 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
159e0 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
159f0 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
15a00 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
15a10 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
15a20 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
15a30 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
15a40 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
15a50 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
15a60 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
15a70 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
15a80 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
15a90 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
15aa0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
15ab0 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
15ac0 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
15ad0 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
15ae0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
15af0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15b00 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
15b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
15b20 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
15b30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
15b40 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
15b50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
15b60 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
15b70 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
15b80 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
15b90 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
15ba0 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
15bb0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
15bc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
15bd0 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
15be0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
15bf0 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
15c00 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
15c10 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
15c20 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
15c30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
15c40 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
15c50 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
15c60 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
15c70 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
15c80 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
15c90 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
15ca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
15cb0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
15cc0 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20  _BKPT;  /* IMP: 
15cd0 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f  R-65497-44594 */
15ce0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69  .  }..  if( sqli
15cf0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15d00 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b  bCoreMutex==0 ){
15d10 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
15d20 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
15d30 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
15d40 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29  E_OPEN_NOMUTEX )
15d50 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
15d60 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
15d70 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
15d80 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
15d90 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
15da0 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  dsafe = 1;.  }el
15db0 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64  se{.    isThread
15dc0 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c  safe = sqlite3Gl
15dd0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
15de0 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  Mutex;.  }.  if(
15df0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
15e00 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
15e10 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26  E ){.    flags &
15e20 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  = ~SQLITE_OPEN_S
15e30 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65  HAREDCACHE;.  }e
15e40 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
15e50 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
15e60 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
15e70 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
15e80 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
15e90 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f  DCACHE;.  }..  /
15ea0 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c  * Remove harmful
15eb0 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66   bits from the f
15ec0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20  lags parameter. 
15ed0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
15ee0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
15ef0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e   and SQLITE_OPEN
15f00 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73  _FULLMUTEX flags
15f10 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74   were.  ** dealt
15f20 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65   with in the pre
15f30 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b  vious code block
15f40 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65  .  Besides these
15f50 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20  , the only.  ** 
15f60 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67  valid input flag
15f70 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  s for sqlite3_op
15f80 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49  en_v2() are SQLI
15f90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
15fa0 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
15fb0 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51  EN_READWRITE, SQ
15fc0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15fd0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  , SQLITE_OPEN_SH
15fe0 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20  AREDCACHE,.  ** 
15ff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
16000 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f  ATECACHE, and so
16010 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73  me reserved bits
16020 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b  .  Silently mask
16030 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74  .  ** off all ot
16040 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a  her flags..  */.
16050 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
16060 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
16070 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
16080 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16090 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
160a0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
160b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
160c0 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20  N_DB |.         
160d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
160e0 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20  N_TEMP_DB | .   
160f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16100 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
16110 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  T_DB | .        
16120 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16130 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
16140 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
16150 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
16160 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  MP_JOURNAL | .  
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16180 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
16190 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
161a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
161b0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
161c0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
161d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f    SQLITE_OPEN_NO
161e0 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
161f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16200 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20  EN_FULLMUTEX |. 
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16220 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
16230 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
16240 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
16250 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
16260 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
16270 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
16280 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
16290 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
162a0 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
162b0 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
162c0 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
162d0 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
162e0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
162f0 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
16300 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
16310 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
16320 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16330 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
16340 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
16350 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
16360 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
16370 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
16380 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
16390 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
163a0 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
163b0 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
163c0 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
163d0 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
163e0 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
163f0 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
16400 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
16410 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
16420 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
16430 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
16440 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
16450 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74  ));.  db->aLimit
16460 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  [SQLITE_LIMIT_WO
16470 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20  RKER_THREADS] = 
16480 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
16490 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20  ORKER_THREADS;. 
164a0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
164b0 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41  = 1;.  db->nextA
164c0 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64  utovac = -1;.  d
164d0 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69  b->szMmap = sqli
164e0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
164f0 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65  szMmap;.  db->ne
16500 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a  xtPagesize = 0;.
16510 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
16520 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46  Mmap = 0x7FFFFFF
16530 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  F;.  db->flags |
16540 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
16550 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
16560 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20  EnableTrigger | 
16570 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
16580 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  l.#if !defined(S
16590 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
165a0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c  TOMATIC_INDEX) |
165b0 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  | SQLITE_DEFAULT
165c0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
165d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
165e0 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49    | SQLITE_AutoI
165f0 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndex.#endif.#if 
16600 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
16610 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20  KPTFULLFSYNC.   
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
16630 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46  SQLITE_CkptFullF
16640 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20  Sync.#endif.#if 
16650 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
16660 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
16680 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
16690 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
166a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
166b0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
166e0 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
166f0 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
16700 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
16710 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
16720 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
16730 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
16740 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
16750 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
16760 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51  EIGN_KEYS) && SQ
16770 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
16780 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20  EIGN_KEYS.      
16790 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
167a0 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a  ITE_ForeignKeys.
167b0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
167c0 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53  ed(SQLITE_REVERS
167d0 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45  E_UNORDERED_SELE
167e0 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  CTS).           
167f0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
16800 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64  everseOrder.#end
16810 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c  if.      ;.  sql
16820 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
16830 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
16840 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16850 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
16860 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
16870 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
16880 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
16890 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
168a0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
168b0 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
168c0 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
168d0 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
168e0 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
168f0 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
16900 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
16910 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
16920 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
16930 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
16940 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
16950 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
16960 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49  e..  **.  ** EVI
16970 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38  DENCE-OF: R-5278
16980 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20 64  6-44878 SQLite d
16990 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75 69  efines three bui
169a0 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a  lt-in collating.
169b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a    ** functions:.
169c0 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
169d0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
169e0 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
169f0 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
16a00 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
16a10 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
16a20 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
16a30 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
16a40 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
16a50 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
16a60 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
16a70 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e  _UTF16LE, 0, bin
16a80 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
16a90 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
16aa0 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51  db, "NOCASE", SQ
16ab0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f  LITE_UTF8, 0, no
16ac0 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
16ad0 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
16ae0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54  ollation(db, "RT
16af0 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  RIM", SQLITE_UTF
16b00 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e  8, (void*)1, bin
16b10 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
16b20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
16b30 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
16b40 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
16b50 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
16b60 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32 32 34  F: R-08308-17224
16b70 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   The default col
16b80 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
16b90 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72  for all.  ** str
16ba0 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59 2e 20  ings is BINARY. 
16bb0 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c  .  */.  db->pDfl
16bc0 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  tColl = sqlite3F
16bd0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  indCollSeq(db, S
16be0 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e  QLITE_UTF8, "BIN
16bf0 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65  ARY", 0);.  asse
16c00 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  rt( db->pDfltCol
16c10 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61  l!=0 );..  /* Pa
16c20 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rse the filename
16c30 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a  /URI argument. *
16c40 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67  /.  db->openFlag
16c50 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20  s = flags;.  rc 
16c60 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  = sqlite3ParseUr
16c70 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  i(zVfs, zFilenam
16c80 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e  e, &flags, &db->
16c90 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a  pVfs, &zOpen, &z
16ca0 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
16cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16cc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16cd0 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d  TE_NOMEM ) db->m
16ce0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
16cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16d00 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
16d10 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
16d20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
16d30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16d40 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
16d50 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
16d60 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
16d70 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
16d80 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
16d90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
16da0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
16db0 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
16dc0 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
16df0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
16e00 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
16e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16e20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
16e30 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
16e40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16e50 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
16e60 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
16e70 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f   rc);.    goto o
16e80 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
16e90 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16ea0 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
16eb0 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  t);.  db->aDb[0]
16ec0 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
16ed0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
16ee0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
16ef0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
16f00 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64  ocFailed ) ENC(d
16f10 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28  b) = SCHEMA_ENC(
16f20 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
16f30 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62  reeLeave(db->aDb
16f40 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
16f50 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
16f60 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
16f70 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  t(db, 0);..  /* 
16f80 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
16f90 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
16fa0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
16fb0 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68  s 'full'; for th
16fc0 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
16fd0 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45  base it is 'NONE
16fe0 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  '. This matches 
16ff0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
17000 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
17010 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
17020 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
17030 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
17040 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64  y_level = 3;.  d
17050 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
17060 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e  = "temp";.  db->
17070 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[1].safety_le
17080 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e  vel = 1;..  db->
17090 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
170a0 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
170b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
170c0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
170d0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
170e0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
170f0 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
17100 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
17110 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
17120 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
17130 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
17140 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
17150 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
17160 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
17170 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
17180 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
17190 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
171a0 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _OK);.  sqlite3R
171b0 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
171c0 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20  nctions(db);..  
171d0 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69  /* Load automati
171e0 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65  c extensions - e
171f0 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68  xtensions that h
17200 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65  ave been registe
17210 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  red.  ** using t
17220 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d  he sqlite3_autom
17230 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29  atic_extension()
17240 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20   API..  */.  rc 
17250 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
17260 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d  e(db);.  if( rc=
17270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17280 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61    sqlite3AutoLoa
17290 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  dExtensions(db);
172a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
172b0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
172c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
172d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
172e0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
172f0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
17300 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
17310 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
17320 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
17330 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
17340 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
17350 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
17360 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
17370 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
17380 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
17390 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
173a0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
173b0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
173c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
173d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
173e0 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
173f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
17400 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
17410 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
17420 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17430 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62  E_FTS3.  if( !db
17440 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
17450 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
17460 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
17470 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b  te3Fts3Init(db);
17480 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
17490 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
174a0 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d  E_ICU.  if( !db-
174b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
174c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
174d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
174e0 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
174f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
17500 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17510 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
17520 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
17540 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17550 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
17560 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
17570 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
17580 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
17590 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
175a0 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
175b0 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
175c0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
175d0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
175e0 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
175f0 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
17600 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
17610 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
17620 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
17630 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
17640 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
17650 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
17660 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
17670 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
17680 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
17690 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
176a0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
176b0 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
176c0 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
176d0 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
17700 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
17710 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
17720 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28   ) sqlite3Error(
17730 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45  db, rc);..  /* E
17740 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73  nable the lookas
17750 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79  ide-malloc subsy
17760 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c  stem */.  setupL
17770 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20  ookaside(db, 0, 
17780 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17790 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c  fig.szLookaside,
177a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
177b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
177c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
177d0 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c  okaside);..  sql
177e0 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
177f0 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49  ckpoint(db, SQLI
17800 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41  TE_DEFAULT_WAL_A
17810 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a  UTOCHECKPOINT);.
17820 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73  .opendb_out:.  s
17830 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65  qlite3_free(zOpe
17840 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  n);.  if( db ){.
17850 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
17860 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68  mutex!=0 || isTh
17870 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20  readsafe==0.    
17880 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
17890 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
178a0 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  ullMutex==0 );. 
178b0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
178c0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
178d0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
178e0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
178f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  );.  assert( db!
17900 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
17910 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20  _NOMEM );.  if( 
17920 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
17930 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
17940 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64  close(db);.    d
17950 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  b = 0;.  }else i
17960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17970 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
17980 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
17990 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70  _SICK;.  }.  *pp
179a0 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20  Db = db;.#ifdef 
179b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
179c0 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74  LLOG.  if( sqlit
179d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
179e0 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a  Sqllog ){.    /*
179f0 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61   Opening a db ha
17a00 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
17a10 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
17a20 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20   0. */.    void 
17a30 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47  *pArg = sqlite3G
17a40 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
17a50 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69  logArg;.    sqli
17a60 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17a70 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62  xSqllog(pArg, db
17a80 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  , zFilename, 0);
17a90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
17aa0 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45  turn sqlite3ApiE
17ab0 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  xit(0, rc);.}../
17ac0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
17ad0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
17ae0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
17af0 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
17b00 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  ar *zFilename, .
17b10 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
17b20 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70   .){.  return op
17b30 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
17b40 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20  name, ppDb,.    
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
17b70 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
17b80 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
17b90 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
17ba0 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74  open_v2(.  const
17bb0 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
17bc0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
17bd0 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20  ilename (UTF-8) 
17be0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
17bf0 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pDb,         /* 
17c00 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68  OUT: SQLite db h
17c10 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  andle */.  int f
17c20 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
17c30 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20     /* Flags */. 
17c40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
17c50 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  s        /* Name
17c60 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74   of VFS module t
17c70 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  o use */.){.  re
17c80 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
17c90 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  e(filename, ppDb
17ca0 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
17cb0 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a  flags, zVfs);.}.
17cc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17cd0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
17ce0 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
17cf0 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
17d00 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
17d10 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16(.  const void
17d20 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
17d30 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29  sqlite3 **ppDb.)
17d40 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
17d50 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a  zFilename8;   /*
17d60 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64   zFilename encod
17d70 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74  ed in UTF-8 inst
17d80 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f  ead of UTF-16 */
17d90 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
17da0 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
17db0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
17dc0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
17dd0 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
17de0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
17df0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
17e00 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
17e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17e20 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
17e30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
17e40 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
17e50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17e60 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46  .#endif.  if( zF
17e70 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69  ilename==0 ) zFi
17e80 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30  lename = "\000\0
17e90 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  00";.  pVal = sq
17ea0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
17eb0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
17ec0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
17ed0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
17ee0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
17ef0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
17f00 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
17f10 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
17f20 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
17f30 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
17f40 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
17f50 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
17f60 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17f90 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
17fa0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17fb0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
17fc0 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
17fd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
17fe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17ff0 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
18000 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
18010 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
18020 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d  ) ){.      SCHEM
18030 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45  A_ENC(*ppDb) = E
18040 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
18050 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
18060 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
18070 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18080 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OMEM;.  }.  sqli
18090 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
180a0 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71  l);..  return sq
180b0 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
180c0 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  rc);.}.#endif /*
180d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
180e0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
180f0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
18100 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
18110 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
18120 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
18130 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
18140 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
18150 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
18160 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
18170 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
18180 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
18190 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
181a0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
181b0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
181c0 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  id*).){.  return
181d0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
181e0 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
181f0 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74   zName, enc, pCt
18200 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
18210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
18220 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
18230 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
18240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
18250 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
18260 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
18270 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73  ollation_v2(.  s
18280 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
18290 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
182a0 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
182b0 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
182c0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
182d0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
182e0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
182f0 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
18300 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
18310 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
18320 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
18330 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
18340 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
18350 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
18360 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
18370 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
18380 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18390 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
183a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
183b0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
183c0 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
183d0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
183e0 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
183f0 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
18400 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20  re, xDel);.  rc 
18410 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
18420 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
18430 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
18440 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
18450 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
18460 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18470 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
18480 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
18490 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
184a0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
184b0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
184c0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
184d0 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20  _collation16(.  
184e0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
184f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
18500 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  e,.  int enc, . 
18510 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
18520 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
18530 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
18540 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
18550 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
18560 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18570 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23  char *zName8;..#
18580 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18590 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
185a0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
185b0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
185c0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
185d0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
185e0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
185f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18600 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
18610 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
18620 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
18630 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65   zName8 = sqlite
18640 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e  3Utf16to8(db, zN
18650 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
18660 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
18670 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20  if( zName8 ){.  
18680 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
18690 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
186a0 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  8, (u8)enc, pCtx
186b0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
186c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
186d0 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20  e(db, zName8);. 
186e0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
186f0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
18700 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18710 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18720 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
18730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
18740 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
18750 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
18760 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
18770 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
18780 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
18790 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
187a0 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
187b0 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
187c0 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
187d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
187e0 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
187f0 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
18800 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20  eded(.  sqlite3 
18810 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
18820 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
18830 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
18840 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  ed)(void*,sqlite
18850 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
18860 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
18870 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18880 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
18890 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
188a0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
188b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
188c0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
188d0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
188e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
188f0 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
18900 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65  Needed = xCollNe
18910 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  eded;.  db->xCol
18920 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20  lNeeded16 = 0;. 
18930 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
18940 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
18950 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
18960 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
18970 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
18980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
18990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
189a0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
189b0 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
189c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
189d0 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
189e0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
189f0 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
18a00 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
18a10 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
18a20 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
18a30 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
18a40 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
18a50 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20  ion_needed16(.  
18a60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
18a70 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
18a80 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
18a90 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f  CollNeeded16)(vo
18aa0 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
18ab0 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
18ac0 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66  void*).){.#ifdef
18ad0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
18ae0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
18af0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
18b00 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
18b10 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
18b20 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
18b30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
18b40 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
18b50 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
18b60 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c   = 0;.  db->xCol
18b70 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c  lNeeded16 = xCol
18b80 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d  lNeeded16;.  db-
18b90 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
18ba0 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
18bb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18bc0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18bd0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
18be0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
18bf0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18c00 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
18c10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
18c20 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
18c30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18c40 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69  now an anachroni
18c50 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  sm. It used to b
18c60 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65  e used to recove
18c70 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c  r from a.** mall
18c80 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75  oc() failure, bu
18c90 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65  t SQLite now doe
18ca0 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63  s this automatic
18cb0 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
18cc0 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
18cd0 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ver(void){.  ret
18ce0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18cf0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
18d00 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
18d10 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61  er or not the da
18d20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18d30 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  n is in autocomm
18d40 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74  it.** mode.  Ret
18d50 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
18d60 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
18d70 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  ot.  Autocommit 
18d80 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79  mode is on.** by
18d90 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63   default.  Autoc
18da0 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65  ommit is disable
18db0 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61  d by a BEGIN sta
18dc0 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61  tement and reena
18dd0 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e  bled.** by the n
18de0 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  ext COMMIT or RO
18df0 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  LLBACK..*/.int s
18e00 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
18e10 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
18e20 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
18e30 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
18e40 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
18e50 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
18e60 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
18e70 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
18e80 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
18e90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
18ea0 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
18eb0 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
18ec0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
18ed0 74 69 6e 65 73 20 61 72 65 20 73 75 62 73 74 69  tines are substi
18ee0 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61  tutes for consta
18ef0 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  nts SQLITE_CORRU
18f00 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  PT,.** SQLITE_MI
18f10 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  SUSE, SQLITE_CAN
18f20 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f  TOPEN, SQLITE_IO
18f30 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ERR and possibly
18f40 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
18f50 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79  constants.  They
18f60 20 73 65 72 76 65 20 74 77 6f 20 70 75 72 70 6f   serve two purpo
18f70 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
18f80 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
18f90 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
18fa0 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
18fb0 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
18fc0 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
18fd0 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
18fe0 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
18ff0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
19000 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
19010 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
19020 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
19030 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
19040 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
19050 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
19060 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
19070 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
19080 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
19090 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
190a0 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
190b0 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
190c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
190d0 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
190e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
190f0 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
19100 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20  tion at line %d 
19110 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
19120 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
19130 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
19140 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
19150 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19160 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  PT;.}.int sqlite
19170 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
19180 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
19190 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
191a0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
191b0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
191c0 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  og(SQLITE_MISUSE
191d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
191e0 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65   "misuse at line
191f0 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
19200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
19210 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
19220 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
19230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
19240 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ISUSE;.}.int sql
19250 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f  ite3CantopenErro
19260 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
19270 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
19280 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
19290 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
192a0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
192b0 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20  ANTOPEN, .      
192c0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
192d0 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e  open file at lin
192e0 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
192f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19300 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
19310 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
19320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19330 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69  CANTOPEN;.}...#i
19340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19350 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
19360 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
19370 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
19380 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
19390 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
193a0 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
193b0 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
193c0 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
193d0 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
193e0 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
193f0 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
19400 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
19410 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
19420 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
19430 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
19440 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
19450 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
19460 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
19470 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
19480 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19490 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
194a0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
194b0 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
194c0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
194d0 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
194e0 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
194f0 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
19500 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69  or details..*/.i
19510 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  nt sqlite3_table
19520 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
19530 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  /* Connection ha
19560 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
19570 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20  char *zDbName,  
19580 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
19590 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a  e name or NULL *
195a0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
195b0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  zTableName,     
195c0 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
195d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
195e0 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f  ColumnName,    /
195f0 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
19600 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
19610 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f  pzDataType,    /
19620 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72  * OUTPUT: Declar
19630 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a  ed data type */.
19640 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
19650 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a  zCollSeq,     /*
19660 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69   OUTPUT: Collati
19670 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
19680 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e   */.  int *pNotN
19690 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
196a0 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
196b0 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  e if NOT NULL co
196c0 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20  nstraint exists 
196d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61  */.  int *pPrima
196e0 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ryKey,          
196f0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
19700 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20   if column part 
19710 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  of PK */.  int *
19720 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20  pAutoinc        
19730 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
19740 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
19750 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65   is auto-increme
19760 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
19770 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
19780 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  sg = 0;.  Table 
19790 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c  *pTab = 0;.  Col
197a0 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
197b0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20   int iCol = 0;. 
197c0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61   char const *zDa
197d0 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  taType = 0;.  ch
197e0 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53  ar const *zCollS
197f0 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f  eq = 0;.  int no
19800 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  tnull = 0;.  int
19810 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b   primarykey = 0;
19820 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d  .  int autoinc =
19830 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c   0;...#ifdef SQL
19840 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
19850 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
19860 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
19870 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61  (db) || zTableNa
19880 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
19890 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
198a0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
198b0 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  if..  /* Ensure 
198c0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
198d0 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61  ema has been loa
198e0 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
198f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
19900 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
19910 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
19920 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
19930 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72  te3Init(db, &zEr
19940 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c  rMsg);.  if( SQL
19950 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
19960 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
19970 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
19980 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
19990 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54  question */.  pT
199a0 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
199b0 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65  Table(db, zTable
199c0 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  Name, zDbName);.
199d0 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70    if( !pTab || p
199e0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
199f0 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
19a00 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
19a10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
19a20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   the column for 
19a30 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65  which info is re
19a40 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
19a50 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20   zColumnName==0 
19a60 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20  ){.    /* Query 
19a70 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66  for existance of
19a80 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20   table only */. 
19a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
19aa0 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
19ab0 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
19ac0 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
19ad0 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
19ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
19af0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
19b00 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
19b10 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
19b20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19b30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
19b40 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
19b50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61   ){.      if( Ha
19b60 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
19b70 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
19b80 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
19b90 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54         iCol = pT
19ba0 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
19bb0 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d     pCol = iCol>=
19bc0 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 ? &pTab->aCol[
19bd0 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20  iCol] : 0;.     
19be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19bf0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
19c00 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
19c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19c20 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
19c30 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
19c40 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
19c50 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
19c60 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
19c70 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
19c80 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
19c90 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
19ca0 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
19cb0 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
19cc0 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
19cd0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
19ce0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
19cf0 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
19d00 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
19d10 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
19d20 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
19d30 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
19d40 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
19d50 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
19d60 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
19d70 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
19d80 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
19d90 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
19da0 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
19db0 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
19dc0 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
19dd0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
19de0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
19df0 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
19e00 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
19e10 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
19e20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
19e30 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70     zDataType = p
19e40 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
19e50 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
19e60 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
19e70 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
19e80 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
19e90 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d  arykey  = (pCol-
19ea0 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
19eb0 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b  LAG_PRIMKEY)!=0;
19ec0 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70  .    autoinc = p
19ed0 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c  Tab->iPKey==iCol
19ee0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
19ef0 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
19f00 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65  rement)!=0;.  }e
19f10 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  lse{.    zDataTy
19f20 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
19f30 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d      primarykey =
19f40 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a   1;.  }.  if( !z
19f50 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a  CollSeq ){.    z
19f60 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52  CollSeq = "BINAR
19f70 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f  Y";.  }..error_o
19f80 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ut:.  sqlite3Btr
19f90 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
19fa0 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68  .  /* Whether th
19fb0 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
19fc0 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69  succeeded or fai
19fd0 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74  led, set the out
19fe0 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20  put parameters. 
19ff0 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20   ** to whatever 
1a000 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e  their local coun
1a010 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e  terparts contain
1a020 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69  . If an error di
1a030 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68  d occur,.  ** th
1a040 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63  is has the effec
1a050 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c  t of zeroing all
1a060 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
1a070 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
1a080 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44  zDataType ) *pzD
1a090 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54  ataType = zDataT
1a0a0 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c  ype;.  if( pzCol
1a0b0 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65  lSeq ) *pzCollSe
1a0c0 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20  q = zCollSeq;.  
1a0d0 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a  if( pNotNull ) *
1a0e0 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75  pNotNull = notnu
1a0f0 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61  ll;.  if( pPrima
1a100 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72  ryKey ) *pPrimar
1a110 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65  yKey = primaryke
1a120 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e  y;.  if( pAutoin
1a130 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20  c ) *pAutoinc = 
1a140 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20  autoinc;..  if( 
1a150 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26  SQLITE_OK==rc &&
1a160 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71   !pTab ){.    sq
1a170 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1a180 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45  zErrMsg);.    zE
1a190 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  rrMsg = sqlite3M
1a1a0 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73  Printf(db, "no s
1a1b0 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  uch table column
1a1c0 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65  : %s.%s", zTable
1a1d0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43  Name,.        zC
1a1e0 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  olumnName);.    
1a1f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1a200 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
1a210 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
1a220 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25   rc, (zErrMsg?"%
1a230 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b  s":0), zErrMsg);
1a240 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1a250 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
1a260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1a270 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1a280 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a290 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1a2a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a2b0 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
1a2c0 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
1a2d0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
1a2e0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
1a2f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a300 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  _sleep(int ms){.
1a310 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1a320 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Vfs;.  int rc;. 
1a330 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f   pVfs = sqlite3_
1a340 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
1a350 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74  f( pVfs==0 ) ret
1a360 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  urn 0;..  /* Thi
1a370 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
1a380 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   in milliseconds
1a390 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c  , but the underl
1a3a0 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a  ying OsSleep() .
1a3b0 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69    ** API uses mi
1a3c0 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63  croseconds. Henc
1a3d0 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20  e the 1000's..  
1a3e0 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74  */.  rc = (sqlit
1a3f0 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20  e3OsSleep(pVfs, 
1a400 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a  1000*ms)/1000);.
1a410 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a420 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
1a430 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65  disable the exte
1a440 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65  nded result code
1a450 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1a460 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
1a470 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20  t_codes(sqlite3 
1a480 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b  *db, int onoff){
1a490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a4a0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1a4b0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1a4c0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1a4d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a4e0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1a4f0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1a500 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1a510 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
1a520 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78  ask = onoff ? 0x
1a530 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b  ffffffff : 0xff;
1a540 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a550 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1a560 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1a570 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1a580 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65  Invoke the xFile
1a590 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f  Control method o
1a5a0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  n a particular d
1a5b0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
1a5c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
1a5d0 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  trol(sqlite3 *db
1a5e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1a5f0 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76  bName, int op, v
1a600 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
1a610 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
1a620 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  ROR;.  Btree *pB
1a630 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  tree;..#ifdef SQ
1a640 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1a650 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1a660 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1a670 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
1a680 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1a690 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1a6a0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1a6b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42  db->mutex);.  pB
1a6c0 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  tree = sqlite3Db
1a6d0 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
1a6e0 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
1a6f0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61  pBtree ){.    Pa
1a700 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
1a710 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1a720 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  d;.    sqlite3Bt
1a730 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1a740 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
1a750 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1a760 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73  (pBtree);.    as
1a770 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1a780 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69  );.    fd = sqli
1a790 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
1a7a0 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
1a7b0 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( fd!=0 );.    i
1a7c0 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1a7d0 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
1a7e0 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
1a7f0 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
1a800 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  = fd;.      rc =
1a810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a820 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d  }else if( fd->pM
1a830 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
1a840 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1a850 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70  leControl(fd, op
1a860 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c  , pArg);.    }el
1a870 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1a880 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
1a890 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a8a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1a8b0 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ee);.  }.  sqlit
1a8c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1a8d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
1a8e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a8f0 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   Interface to th
1a900 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e  e testing logic.
1a910 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a920 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
1a930 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74   op, ...){.  int
1a940 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66   rc = 0;.#ifndef
1a950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
1a960 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c  LTIN_TEST.  va_l
1a970 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1a980 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
1a990 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
1a9a0 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
1a9b0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1a9c0 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
1a9d0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a9e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1a9f0 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
1aa00 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
1aa10 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
1aa20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1aa30 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
1aa40 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
1aa50 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
1aa60 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
1aa70 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
1aa80 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
1aa90 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
1aaa0 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
1aab0 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
1aac0 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
1aad0 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
1aae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1aaf0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1ab00 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
1ab10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1ab20 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
1ab30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ab40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1ab50 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
1ab60 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
1ab70 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
1ab80 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
1ab90 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
1aba0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1abb0 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
1abc0 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
1abd0 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
1abe0 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
1abf0 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
1ac00 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
1ac10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ac20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ac30 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
1ac40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
1ac50 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
1ac60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ac70 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1ac80 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ac90 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
1aca0 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
1acb0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1acc0 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
1acd0 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
1ace0 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
1acf0 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
1ad00 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
1ad10 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
1ad20 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
1ad30 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
1ad40 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
1ad50 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1ad60 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
1ad70 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
1ad80 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
1ad90 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
1ada0 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1adb0 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
1adc0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1add0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1ade0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1adf0 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
1ae00 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
1ae10 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1ae20 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
1ae30 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
1ae40 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
1ae50 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
1ae60 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
1ae70 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
1ae80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ae90 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1aea0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1aeb0 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c  l(FAULT_INSTALL,
1aec0 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20   xCallback).    
1aed0 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67  **.    ** Arrang
1aee0 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c  e to invoke xCal
1aef0 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72  lback() whenever
1af00 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1af10 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
1af20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63    ** if xCallbac
1af30 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  k is not NULL.. 
1af40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20     **.    ** As 
1af50 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61  a test of the fa
1af60 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65  ult simulator me
1af70 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20  chanism itself, 
1af80 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1af90 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c  0).    ** is cal
1afa0 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  led immediately 
1afb0 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67  after installing
1afc0 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63   the new callbac
1afd0 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  k and the return
1afe0 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72  .    ** value fr
1aff0 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  om sqlite3FaultS
1b000 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68  im(0) becomes th
1b010 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20  e return from.  
1b020 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
1b030 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20  t_control()..   
1b040 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1b050 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
1b060 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20  LT_INSTALL: {.  
1b070 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
1b080 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
1b090 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
1b0a0 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
1b0b0 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
1b0c0 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
1b0d0 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
1b0e0 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
1b0f0 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c  lConfig.xTestCal
1b100 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61  lback = va_arg(a
1b110 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b  p, int(*)(int));
1b120 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b130 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53  typedef int(*TES
1b140 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1b150 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (int);.      sql
1b160 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b170 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1b180 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54   va_arg(ap, TEST
1b190 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b  CALLBACKFUNC_t);
1b1a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1b1b0 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a  te3FaultSim(0);.
1b1c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b1d0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1b1e0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1b1f0 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
1b200 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
1b210 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
1b220 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
1b230 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
1b240 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
1b250 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
1b260 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
1b270 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
1b280 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1b290 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
1b2a0 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
1b2b0 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1b2c0 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
1b2d0 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
1b2e0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1b2f0 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
1b300 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
1b310 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
1b320 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
1b330 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1b340 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
1b350 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
1b360 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1b370 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1b380 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
1b390 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
1b3a0 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
1b3b0 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
1b3c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1b3d0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1b3e0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1b3f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1b400 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
1b410 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
1b420 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1b430 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
1b440 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
1b450 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
1b460 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
1b470 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
1b480 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
1b490 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
1b4a0 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
1b4b0 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
1b4c0 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1b4d0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
1b4e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
1b4f0 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
1b500 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
1b510 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
1b520 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
1b530 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
1b540 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
1b550 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
1b560 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1b570 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
1b580 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
1b590 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
1b5a0 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
1b5b0 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
1b5c0 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62  ** deleterious b
1b5d0 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
1b5e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b5f0 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1b600 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
1b610 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
1b620 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1b630 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
1b640 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
1b650 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
1b660 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
1b670 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
1b680 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
1b690 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
1b6a0 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
1b6b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1b6c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1b6d0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1b6e0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1b6f0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1b700 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
1b710 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1b720 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1b730 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1b740 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
1b750 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
1b760 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
1b770 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1b780 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
1b790 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
1b7a0 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
1b7b0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1b7c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1b7d0 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
1b7e0 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
1b7f0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1b800 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1b810 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1b820 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
1b830 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
1b840 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1b850 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
1b860 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
1b870 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
1b880 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
1b890 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
1b8a0 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1b8b0 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
1b8c0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1b8d0 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
1b8e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b8f0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
1b900 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
1b910 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
1b920 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
1b930 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1b940 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1b950 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1b960 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1b970 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1b980 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1b990 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1b9a0 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1b9b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1b9c0 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1b9d0 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1b9e0 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1b9f0 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1ba00 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1ba10 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1ba20 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1ba30 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1ba40 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1ba50 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
1ba60 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
1ba70 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
1ba80 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
1ba90 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
1baa0 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
1bab0 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
1bac0 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
1bad0 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1bae0 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
1baf0 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
1bb00 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
1bb10 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1bb20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
1bb30 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
1bb40 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
1bb50 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
1bb60 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
1bb70 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
1bb80 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1bb90 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
1bba0 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
1bbb0 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
1bbc0 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1bbd0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1bbe0 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1bbf0 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
1bc00 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
1bc10 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
1bc20 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
1bc30 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1bc40 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
1bc50 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
1bc60 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1bc70 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1bc80 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1bc90 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
1bca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1bcb0 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
1bcc0 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
1bcd0 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
1bce0 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1bcf0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
1bd00 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1bd10 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1bd20 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
1bd30 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
1bd40 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
1bd50 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
1bd60 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1bd70 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
1bd80 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1bd90 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1bda0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1bdb0 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
1bdc0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1bdd0 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
1bde0 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
1bdf0 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
1be00 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
1be10 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
1be20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1be30 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
1be40 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
1be50 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1be60 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
1be70 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1be80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1be90 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
1bea0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1beb0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
1bec0 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
1bed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bee0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1bef0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1bf00 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1bf10 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29  TCTRL_BYTEORDER)
1bf20 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1bf30 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75  The integer retu
1bf40 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65  rned reveals the
1bf50 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74   byte-order of t
1bf60 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77  he computer on w
1bf70 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69  hich.    ** SQLi
1bf80 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20  te is running:. 
1bf90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1bfa0 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64     1     big-end
1bfb0 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
1bfc0 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1bfd0 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20     **      10   
1bfe0 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1bff0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1c000 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1c010 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65  432101     big-e
1c020 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d  ndian,    determ
1c030 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1c040 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33  time.    **  123
1c050 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65  410     little-e
1c060 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1c070 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1c080 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61  e.    */ .    ca
1c090 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c0a0 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a  RL_BYTEORDER: {.
1c0b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c0c0 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20  E_BYTEORDER*100 
1c0d0 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45  + SQLITE_LITTLEE
1c0e0 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54  NDIAN*10 + SQLIT
1c0f0 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20  E_BIGENDIAN;.   
1c100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c110 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1c120 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1c130 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1c140 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
1c150 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1c160 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1c170 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
1c180 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
1c190 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
1c1a0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1c1b0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1c1c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c1d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c1e0 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
1c1f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c200 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1c210 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
1c220 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1c230 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1c240 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1c250 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1c260 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1c270 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
1c280 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
1c290 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1c2a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1c2b0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
1c2c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c2d0 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
1c2e0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1c2f0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1c300 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
1c310 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1c320 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
1c330 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
1c340 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1c350 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
1c360 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
1c370 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
1c380 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
1c390 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
1c3a0 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
1c3b0 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
1c3c0 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
1c3d0 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
1c3e0 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
1c3f0 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
1c400 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
1c410 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
1c420 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
1c430 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
1c440 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
1c450 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
1c460 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1c470 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
1c480 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1c490 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
1c4a0 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
1c4b0 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
1c4c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1c4d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1c4e0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
1c4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1c500 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1c510 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1c520 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
1c530 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
1c540 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
1c550 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c560 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1c570 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
1c580 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
1c590 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1c5a0 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
1c5b0 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
1c5c0 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
1c5d0 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
1c5e0 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
1c5f0 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
1c600 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
1c610 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
1c620 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
1c630 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
1c640 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
1c650 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
1c660 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
1c670 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
1c680 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
1c690 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
1c6a0 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
1c6b0 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
1c6c0 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
1c6d0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1c6e0 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
1c6f0 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
1c700 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
1c710 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
1c720 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1c730 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
1c740 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
1c750 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
1c760 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
1c770 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
1c780 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
1c790 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
1c7a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
1c7b0 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
1c7c0 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
1c7d0 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
1c7e0 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
1c7f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c800 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
1c810 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
1c820 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1c830 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
1c840 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
1c850 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
1c860 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
1c870 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
1c880 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
1c890 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
1c8a0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
1c8b0 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
1c8c0 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
1c8d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c8e0 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
1c8f0 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
1c900 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
1c910 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
1c920 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
1c930 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1c940 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
1c950 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
1c960 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
1c970 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1c980 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
1c990 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
1c9a0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
1c9b0 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
1c9c0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
1c9d0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
1c9e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1c9f0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1ca00 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1ca10 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1ca20 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
1ca30 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
1ca40 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
1ca50 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
1ca60 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
1ca70 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
1ca80 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
1ca90 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1caa0 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
1cab0 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
1cac0 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
1cad0 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
1cae0 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
1caf0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1cb00 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1cb10 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
1cb20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1cb30 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
1cb40 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
1cb50 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1cb60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cb70 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1cb80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1cb90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1cba0 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
1cbb0 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
1cbc0 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
1cbd0 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
1cbe0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
1cbf0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
1cc00 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
1cc10 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
1cc20 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
1cc30 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
1cc40 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
1cc50 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
1cc60 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1cc70 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
1cc80 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
1cc90 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
1cca0 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
1ccb0 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
1ccc0 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
1ccd0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
1cce0 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
1ccf0 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
1cd00 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
1cd10 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
1cd20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
1cd30 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
1cd40 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1cd50 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1cd60 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
1cd70 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1cd80 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
1cd90 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
1cda0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1cdb0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1cdc0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1cdd0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cde0 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1cdf0 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61  OVERAGE, xCallba
1ce00 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a  ck, ptr);.    **
1ce10 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1ce20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61  VDBE coverage ca
1ce30 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
1ce40 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74  to xCallback wit
1ce50 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  h context .    *
1ce60 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20  * pointer ptr.. 
1ce70 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ce80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56  QLITE_TESTCTRL_V
1ce90 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a  DBE_COVERAGE: {.
1cea0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
1ceb0 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
1cec0 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
1ced0 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  *branch_callback
1cee0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75  )(void*,int,u8,u
1cef0 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
1cf00 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56  3GlobalConfig.xV
1cf10 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61  dbeBranch = va_a
1cf20 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c  rg(ap,branch_cal
1cf30 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71  lback);.      sq
1cf40 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1cf50 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67  g.pVdbeBranchArg
1cf60 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69   = va_arg(ap,voi
1cf70 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  d*);.#endif.    
1cf80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cf90 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1cfa0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1cfb0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
1cfc0 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e  RTER_MMAP, db, n
1cfd0 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73  Max); */.    cas
1cfe0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1cff0 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b  L_SORTER_MMAP: {
1d000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1d010 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1d020 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1d030 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d   db->nMaxSorterM
1d040 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  map = va_arg(ap,
1d050 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1d060 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d070 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1d080 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d090 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29  TESTCTRL_ISINIT)
1d0a0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1d0b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1d0c0 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62   if SQLite has b
1d0d0 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
1d0e0 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  and SQLITE_ERROR
1d0f0 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a   if.    ** not..
1d100 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d110 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d120 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20  ISINIT: {.      
1d130 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1d140 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d  lConfig.isInit==
1d150 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
1d160 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1d170 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d180 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1d190 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d1a0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
1d1b0 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e  , db, dbName, on
1d1c0 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  Off, tnum);.    
1d1d0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  **.    ** This t
1d1e0 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75  est control is u
1d1f0 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d  sed to create im
1d200 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1d210 22 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65  "db" is a pointe
1d220 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  r.    ** to the 
1d230 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d240 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20  ion.  dbName is 
1d250 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1d260 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72  e (ex: "main" or
1d270 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20  .    ** "temp") 
1d280 77 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69  which will recei
1d290 76 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e  ve the imposter.
1d2a0 20 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20    "onOff" turns 
1d2b0 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e  imposter mode on
1d2c0 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20  .    ** or off. 
1d2d0 20 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72   "tnum" is the r
1d2e0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1d2f0 62 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20  b-tree to which 
1d300 74 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20  the imposter.   
1d310 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64   ** table should
1d320 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a   connect..    **
1d330 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69  .    ** Enable i
1d340 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c  mposter mode onl
1d350 79 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  y when the schem
1d360 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
1d370 65 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e  en parsed.  Then
1d380 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69  .    ** run a si
1d390 6e 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c  ngle CREATE TABL
1d3a0 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63  E statement to c
1d3b0 6f 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70  onstruct the imp
1d3c0 6f 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20  oster table in. 
1d3d0 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64     ** the parsed
1d3e0 20 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74   schema.  Then t
1d3f0 75 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  urn imposter mod
1d400 65 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e  e back off again
1d410 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d420 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20  If onOff==0 and 
1d430 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65  tnum>0 then rese
1d440 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  t the schema for
1d450 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20   all databases, 
1d460 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74  causing.    ** t
1d470 68 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20  he schema to be 
1d480 72 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78  reparsed the nex
1d490 74 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65  t time it is nee
1d4a0 64 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74  ded.  This has t
1d4b0 68 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74  he.    ** effect
1d4c0 20 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20   of erasing all 
1d4d0 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
1d4e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d4f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d500 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20  _IMPOSTER: {.   
1d510 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1d520 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1d530 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  te3*);.      sql
1d540 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1d550 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1d560 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20     db->init.iDb 
1d570 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
1d580 61 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61  ame(db, va_arg(a
1d590 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b  p,const char*));
1d5a0 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
1d5b0 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
1d5c0 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20  imposterTable = 
1d5d0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1d5e0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e        db->init.n
1d5f0 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28  ewTnum = va_arg(
1d600 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  ap,int);.      i
1d610 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1d620 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  ==0 && db->init.
1d630 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  newTnum>0 ){.   
1d640 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
1d650 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
1d660 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20  nection(db);.   
1d670 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1d680 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1d690 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1d6a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d6b0 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
1d6c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1d6d0 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
1d6e0 53 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  ST */.  return r
1d6f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d700 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f   is a utility ro
1d710 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f  utine, useful to
1d720 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1d730 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b  ions, that check
1d740 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61  s.** to see if a
1d750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1d760 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f  as a URI that co
1d770 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66  ntained a specif
1d780 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72  ic query .** par
1d790 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73  ameter, and if s
1d7a0 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61  o obtains the va
1d7b0 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79  lue of the query
1d7c0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
1d7d0 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1d7e0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1d7f0 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72  filename pointer
1d800 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65   passed into the
1d810 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68   xOpen().** meth
1d820 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c  od of a VFS impl
1d830 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
1d840 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74   zParam argument
1d850 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1d860 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  the.** query par
1d870 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20  ameter we seek. 
1d880 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1d890 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
1d8a0 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a  of the zParam.**
1d8b0 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74   parameter if it
1d8c0 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65   exists.  If the
1d8d0 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20   parameter does 
1d8e0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
1d8f0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
1d900 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ns a NULL pointe
1d910 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
1d920 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61   *sqlite3_uri_pa
1d930 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68  rameter(const ch
1d940 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
1d950 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1d960 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  m){.  if( zFilen
1d970 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d  ame==0 || zParam
1d980 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1d990 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1d9a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d9b0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1d9c0 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d   while( zFilenam
1d9d0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
1d9e0 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  x = strcmp(zFile
1d9f0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1da00 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
1da10 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1da20 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
1da30 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72      if( x==0 ) r
1da40 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
1da50 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
1da60 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1da70 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1da80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1da90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1daa0 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  n a boolean valu
1dab0 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
1dac0 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rameter..*/.int 
1dad0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
1dae0 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ean(const char *
1daf0 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1db00 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69   char *zParam, i
1db10 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e  nt bDflt){.  con
1db20 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1db30 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1db40 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
1db50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d  aram);.  bDflt =
1db60 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74   bDflt!=0;.  ret
1db70 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47  urn z ? sqlite3G
1db80 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66  etBoolean(z, bDf
1db90 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a  lt) : bDflt;.}..
1dba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36  /*.** Return a 6
1dbb0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
1dbc0 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
1dbd0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71  parameter..*/.sq
1dbe0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1dbf0 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20  te3_uri_int64(. 
1dc00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1dc10 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69  lename,    /* Fi
1dc20 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64  lename as passed
1dc30 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63   to xOpen */.  c
1dc40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1dc50 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20  m,       /* URI 
1dc60 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74  parameter sought
1dc70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1dc80 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20  t64 bDflt       
1dc90 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72  /* return if par
1dca0 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e  ameter is missin
1dcb0 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  g */.){.  const 
1dcc0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1dcd0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1dce0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1dcf0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  m);.  sqlite3_in
1dd00 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26  t64 v;.  if( z &
1dd10 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
1dd20 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53  xToI64(z, &v)==S
1dd30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dd40 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1dd50 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1dd60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1dd70 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1dd80 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1dd90 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1dda0 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1ddb0 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1ddc0 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1ddd0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1dde0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1ddf0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1de00 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1de10 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1de20 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1de30 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
1de40 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
1de50 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
1de60 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
1de70 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1de80 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44     return db->aD
1de90 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a  b[i].pBt;.    }.
1dea0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1deb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1dec0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
1ded0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1dee0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
1def0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1df00 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
1df10 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
1df20 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
1df30 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1df40 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1df50 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65  tree *pBt;.#ifde
1df60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1df70 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1df80 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1df90 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
1dfa0 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
1dfb0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
1dfc0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
1dfd0 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69  dif.  pBt = sqli
1dfe0 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1dff0 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1e000 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1e010 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
1e020 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
1e030 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e040 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
1e050 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
1e060 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
1e070 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
1e080 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
1e090 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
1e0a0 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1e0b0 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
1e0c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1e0d0 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1e0e0 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  pBt;.#ifdef SQLI
1e0f0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1e100 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1e110 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1e120 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
1e130 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
1e140 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
1e150 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  -1;.  }.#endif. 
1e160 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62   pBt = sqlite3Db
1e170 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
1e180 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  zDbName);.  retu
1e190 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33  rn pBt ? sqlite3
1e1a0 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
1e1b0 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a           pBt) : -1;.}.