/ Hex Artifact Content
Login

Artifact b0a7f3f9ff70106b7735f38c602d1b3ca56eb065:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 2f 2a 20 6e 6f 74 2d 70 72 69 76 61  .*/./* not-priva
08d0: 74 65 20 2a 2f 20 76 6f 69 64 20 28 2a 73 71 6c  te */ void (*sql
08e0: 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e  ite3IoTrace)(con
08f0: 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d  st char*, ...) =
0900: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
0910: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
0920: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
0930: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  le points to a s
0940: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
0950: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
0960: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20  directory, then 
0970: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77  that directory w
0980: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
0990: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  tore.** temporar
09a0: 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  y files..**.** S
09b0: 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41  ee also the "PRA
09c0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
09d0: 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f  irectory" SQL co
09e0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  mmand..*/.char *
09f0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
0a00: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a  ectory = 0;../*.
0a10: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0a20: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0a30: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0a40: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0a50: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0a60: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0a70: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0a80: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0a90: 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74  store.** all dat
0aa0: 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63  abase files spec
0ab0: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
0ac0: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a  ative pathname..
0ad0: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
0ae0: 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f  he "PRAGMA data_
0af0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
0b00: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
0b10: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64  .char *sqlite3_d
0b20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
0b30: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  0;../*.** Initia
0b40: 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a  lize SQLite.  .*
0b50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0b60: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
0b70: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
0b80: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0b90: 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e  tion,.** VFS, an
0ba0: 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
0bb0: 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ms prior to doin
0bc0: 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f  g any serious wo
0bd0: 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74  rk with.** SQLit
0be0: 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20  e.  But as long 
0bf0: 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f  as you do not co
0c00: 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54  mpile with SQLIT
0c10: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
0c20: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
0c30: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
0c40: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
0c50: 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63  key routines suc
0c60: 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  h as.** sqlite3_
0c70: 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  open().  .**.** 
0c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0c90: 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f  a no-op except o
0ca0: 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73 74  n its very first
0cb0: 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72   call for the pr
0cc0: 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72  ocess,.** or for
0cd0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
0ce0: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
0cf0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
0d00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
0d10: 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c  t thread to call
0d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
0d30: 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ns the initializ
0d40: 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70  ation to.** comp
0d50: 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73  letion.  If subs
0d60: 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20 63  equent threads c
0d70: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
0d80: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
0d90: 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20  t.** thread has 
0da0: 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69  finished the ini
0db0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
0dc0: 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ess, then the su
0dd0: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65  bsequent.** thre
0de0: 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  ads must block u
0df0: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
0e00: 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20 77  hread finishes w
0e10: 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ith the initiali
0e20: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  zation..**.** Th
0e30: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 6d  e first thread m
0e40: 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72  ight call this r
0e50: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
0e60: 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a  ly.  Recursive.*
0e70: 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20  * calls to this 
0e80: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
0e90: 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75  ot block, of cou
0ea0: 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  rse.  Otherwise 
0eb0: 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  the.** initializ
0ec0: 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f  ation process wo
0ed0: 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65  uld never comple
0ee0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20  te..**.** Let X 
0ef0: 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68 72  be the first thr
0f00: 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69  ead to enter thi
0f10: 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20  s routine.  Let 
0f20: 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  Y be some other.
0f30: 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e  ** thread.  Then
0f40: 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69   while the initi
0f50: 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  al invocation of
0f60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79   this routine by
0f70: 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c   X is.** incompl
0f80: 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75 69  ete, it is requi
0f90: 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  red that:.**.** 
0fa0: 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74     *  Calls to t
0fb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  his routine from
0fc0: 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e   Y must block un
0fd0: 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f  til the outer-mo
0fe0: 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c  st.**       call
0ff0: 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e   by X completes.
1000: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63  .**.**    *  Rec
1010: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
1020: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
1030: 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75 72  m thread X retur
1040: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  n immediately.**
1050: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 62         without b
1060: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
1070: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1080: 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45  ze(void){.  MUTE
1090: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
10a0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
10b0: 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   )       /* The 
10c0: 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65  main static mute
10d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  x */.  int rc;  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1110: 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  de */.#ifdef SQL
1120: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
1130: 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e   int bRunExtraIn
1140: 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  it = 0;         
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1160: 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   Extra initializ
1170: 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a  ation needed */.
1180: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
11a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73   rc = sqlite3_ws
11b0: 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29  d_init(4096, 24)
11c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
11e0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
11f0: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69  if..  /* If SQLi
1200: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  te is already co
1210: 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c  mpletely initial
1220: 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  ized, then this 
1230: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  call.  ** to sql
1240: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1250: 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  ) should be a no
1260: 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e  -op.  But the in
1270: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1280: 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65  * must be comple
1290: 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d  te.  So isInit m
12a0: 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75  ust not be set u
12b0: 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e  ntil the very en
12c0: 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72  d.  ** of this r
12d0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  outine..  */.  i
12e0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
12f0: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20  Config.isInit ) 
1300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1310: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
1320: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1330: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
1340: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
1350: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
1360: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
1370: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
1380: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
1390: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
13a0: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
13b0: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
13c0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
13d0: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
13e0: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
13f0: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
1400: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
1410: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
1420: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
1430: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
1440: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
1450: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
1460: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
1470: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1480: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
1490: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14a0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
14b0: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
14c0: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
14d0: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
14e0: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
14f0: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1500: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1510: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
1520: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
1530: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
1540: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
1550: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
1560: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
1570: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
1580: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
1590: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
15a0: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
15b0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
15c0: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
15d0: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
15e0: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
15f0: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1600: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
1610: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
1620: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1630: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1640: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
1650: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
1660: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
1670: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
1680: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
1690: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
16a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16b0: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
16c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
16d0: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
16f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1700: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1710: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1720: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1730: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1740: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
1750: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1760: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
1770: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
1780: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
1790: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
17a0: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
17b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
17d0: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
17e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17f0: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1800: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1810: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1830: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1850: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1860: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1870: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1880: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1890: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
18a0: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
18b0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
18c0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
18d0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
18e0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
18f0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1900: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1910: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1920: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1930: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1940: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1950: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1970: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1980: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1990: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
19a0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
19b0: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
19c0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
19d0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
19e0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
19f0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1a00: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1a10: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1a20: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a30: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1a40: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1a50: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1a60: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1a70: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1a80: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1a90: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1aa0: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1ab0: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1ac0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1ad0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1ae0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1af0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1b00: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1b10: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1b20: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1b30: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1b40: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1b50: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1b60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1b70: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1b80: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1b90: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1ba0: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1bb0: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1bc0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1bd0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1be0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1bf0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1c00: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1c10: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1c20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c30: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1c40: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1c50: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1c60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1c70: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1c80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c90: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1ca0: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1cb0: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1cc0: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1cd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1ce0: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1cf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d00: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1d10: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1d20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1d30: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1d40: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
1d50: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
1d60: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
1d70: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1d80: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1d90: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
1da0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1db0: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
1dc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1dd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1df0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1e00: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
1e10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e20: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
1e30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1e50: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1e60: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1e70: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1e80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1e90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ea0: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
1eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1ec0: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
1ed0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1ee0: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
1ef0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1f00: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
1f10: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
1f20: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1f30: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f40: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1f50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1f60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1f70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f80: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1f90: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
1fa0: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
1fb0: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
1fc0: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
1fd0: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
1fe0: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
1ff0: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2000: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2010: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2020: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2030: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
2040: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2050: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
2060: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
2070: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2080: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
2090: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
20a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
20b0: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
20c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
20d0: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
20e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20f0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2100: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2110: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2120: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2130: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
2140: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
2150: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
2160: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
2170: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
2180: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
2190: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
21a0: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
21b0: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
21c0: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
21d0: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
21e0: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
21f0: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2200: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2210: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2220: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2230: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
2240: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2250: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
2260: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
2270: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
2280: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
2290: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
22a0: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
22b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22c0: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
22d0: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
22e0: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
22f0: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2300: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2310: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2320: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2330: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
2340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2350: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2360: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2370: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2380: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2390: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
23a0: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
23b0: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
23c0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
23d0: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
23e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
23f0: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2400: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2410: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2420: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2430: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2440: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
2450: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2460: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2470: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2480: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2490: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
24a0: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
24b0: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
24c0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
24d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24e0: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
24f0: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2500: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2510: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2520: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2530: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
2540: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
2550: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2560: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2570: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2580: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2590: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
25a0: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
25b0: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
25c0: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
25d0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
25e0: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
25f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2600: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2610: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2620: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2630: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2640: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2650: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2660: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2670: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2680: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2690: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
26a0: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
26b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
26c0: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
26d0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
26e0: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
26f0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2700: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2710: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2720: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2730: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2740: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2750: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2760: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2770: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2780: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2790: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
27a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
27b0: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
27c0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
27d0: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
27e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27f0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2800: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2810: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2820: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2830: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2840: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2850: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2860: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2870: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2880: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2890: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
28a0: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
28b0: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
28c0: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
28d0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
28e0: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
28f0: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2900: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2910: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2920: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2930: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2940: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2950: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2960: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2970: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2980: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2990: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
29a0: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
29b0: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
29c0: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
29d0: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
29e0: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
29f0: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2a00: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2a10: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2a20: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2a30: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2a40: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2a50: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2a60: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2a70: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2a80: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2a90: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2aa0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2ab0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2ac0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2ad0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2ae0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2af0: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2b00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2b10: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2b20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2b30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2b50: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2b60: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2b70: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2b80: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2b90: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2ba0: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2bb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bc0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2bd0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2be0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2bf0: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2c00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2c10: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c20: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2c30: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2c40: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2c50: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2c60: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2c70: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2c80: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2c90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2ca0: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2cb0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2cc0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cd0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2ce0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2cf0: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2d00: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2d10: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2d20: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2d30: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2d40: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2d50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d60: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2d70: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2d80: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
2d90: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
2da0: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
2db0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
2dc0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
2dd0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
2de0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2df0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2e00: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
2e10: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
2e20: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
2e30: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
2e40: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
2e50: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
2e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2e70: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
2e80: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2e90: 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a  all mutexing */.
2ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2eb0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
2ec0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  utex = 0;.      
2ed0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ee0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
2ef0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
2f00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
2f10: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2f20: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
2f30: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2f40: 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30  E>0 /* IMP: R-20
2f50: 35 32 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20  520-54086 */.   
2f60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2f70: 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a  FIG_MULTITHREAD:
2f80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61   {.      /* Disa
2f90: 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20  ble mutexing of 
2fa0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2fb0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  ions */.      /*
2fc0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67   Enable mutexing
2fd0: 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74   of core data st
2fe0: 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
2ff0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3000: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3010: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
3020: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3030: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a  bFullMutex = 0;.
3040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3050: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
3060: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
3070: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
3080: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
3090: 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d  /* IMP: R-59593-
30a0: 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63 61 73  21810 */.    cas
30b0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
30c0: 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  SERIALIZED: {.  
30d0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c      /* Enable al
30e0: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
30f0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3100: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3110: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ex = 1;.      sq
3120: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3130: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31  g.bFullMutex = 1
3140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3150: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3170: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3190: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36  0 /* IMP: R-6366
31a0: 36 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63  6-48755 */.    c
31b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
31c0: 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20  G_MUTEX: {.     
31d0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
31e0: 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78  lternative mutex
31f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3200: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3210: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
3220: 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c  ex = *va_arg(ap,
3230: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
3240: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
3250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3260: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3270: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3280: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3290: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
32a0: 3a 20 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20  : R-14450-37597 
32b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
32c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54  TE_CONFIG_GETMUT
32d0: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52  EX: {.      /* R
32e0: 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72  etrieve the curr
32f0: 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ent mutex implem
3300: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3310: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
3320: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
3330: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3340: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
3350: 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
3360: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
3370: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3380: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
3390: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
33a0: 2d 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30  -OF: R-55594-210
33b0: 33 30 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  30 The SQLITE_CO
33c0: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69  NFIG_MALLOC opti
33d0: 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20  on takes a.     
33e0: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
33f0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70  ent which is a p
3400: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
3410: 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20  tance of the.   
3420: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65     ** sqlite3_me
3430: 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74  m_methods struct
3440: 75 72 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ure. The argumen
3450: 74 20 73 70 65 63 69 66 69 65 73 20 61 6c 74 65  t specifies alte
3460: 72 6e 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a  rnative.      **
3470: 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72   low-level memor
3480: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  y allocation rou
3490: 74 69 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64  tines to be used
34a0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
34b0: 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a   memory.      **
34c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
34d0: 69 6e 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20  ines built into 
34e0: 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20  SQLite. */.     
34f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3500: 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67  nfig.m = *va_arg
3510: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
3520: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
3530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3550: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a  ONFIG_GETMALLOC:
3560: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3570: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33  ENCE-OF: R-51213
3580: 2d 34 36 34 31 34 20 54 68 65 20 53 51 4c 49 54  -46414 The SQLIT
3590: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c  E_CONFIG_GETMALL
35a0: 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  OC option takes 
35b0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
35c0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
35d0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
35e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
35f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
3600: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3610: 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20   structure. The 
3620: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3630: 6f 64 73 20 73 74 72 75 63 74 75 72 65 20 69 73  ods structure is
3640: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
3650: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
3660: 74 6c 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f  tly defined memo
3670: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f  ry allocation ro
3680: 75 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20  utines. */.     
3690: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
36a0: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
36b0: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
36c0: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
36d0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
36e0: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
36f0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
3700: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
3710: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3720: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3730: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
3740: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
3750: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3760: 36 31 32 37 35 2d 33 35 31 35 37 20 54 68 65 20  61275-35157 The 
3770: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
3780: 4d 53 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74  MSTATUS option t
3790: 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69  akes.      ** si
37a0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66  ngle argument of
37b0: 20 74 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72   type int, inter
37c0: 70 72 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c  preted as a bool
37d0: 65 61 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c  ean, which enabl
37e0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64  es.      ** or d
37f0: 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c  isables the coll
3800: 65 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79  ection of memory
3810: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74   allocation stat
3820: 69 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20  istics. */.     
3830: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3840: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20  nfig.bMemstat = 
3850: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3860: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3870: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3880: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54  ITE_CONFIG_SCRAT
3890: 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  CH: {.      /* E
38a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
38b0: 34 30 34 2d 36 30 38 38 37 20 54 68 65 72 65 20  404-60887 There 
38c0: 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65  are three argume
38d0: 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
38e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43  SQLITE_CONFIG_SC
38f0: 52 41 54 43 48 3a 20 41 20 70 6f 69 6e 74 65 72  RATCH: A pointer
3900: 20 61 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   an 8-byte align
3910: 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
3920: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77   from.      ** w
3930: 68 69 63 68 20 74 68 65 20 73 63 72 61 74 63 68  hich the scratch
3940: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c   allocations wil
3950: 6c 20 62 65 20 64 72 61 77 6e 2c 20 74 68 65 20  l be drawn, the 
3960: 73 69 7a 65 20 6f 66 20 65 61 63 68 20 73 63 72  size of each scr
3970: 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c  atch.      ** al
3980: 6c 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61  location (sz), a
3990: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  nd the maximum n
39a0: 75 6d 62 65 72 20 6f 66 20 73 63 72 61 74 63 68  umber of scratch
39b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29   allocations (N)
39c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
39d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
39e0: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
39f0: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
3a00: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3a10: 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68  Config.szScratch
3a20: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3a30: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3a40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53  3GlobalConfig.nS
3a50: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
3a60: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3a70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3a80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3a90: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b  FIG_PAGECACHE: {
3aa0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3ab0: 43 45 2d 4f 46 3a 20 52 2d 33 31 34 30 38 2d 34  CE-OF: R-31408-4
3ac0: 30 35 31 30 20 54 68 65 72 65 20 61 72 65 20 74  0510 There are t
3ad0: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3ae0: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3af0: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
3b00: 48 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  HE: A pointer to
3b10: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
3b20: 6d 65 6d 6f 72 79 2c 20 74 68 65 20 73 69 7a 65  memory, the size
3b30: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 65 61 63  .      ** of eac
3b40: 68 20 70 61 67 65 20 62 75 66 66 65 72 20 28 73  h page buffer (s
3b50: 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  z), and the numb
3b60: 65 72 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e  er of pages (N).
3b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
3b90: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3ba0: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3bb0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3bc0: 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61  ig.szPage = va_a
3bd0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3be0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3bf0: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76  Config.nPage = v
3c00: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3c20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3c30: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
3c40: 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20  _HDRSZ: {.      
3c50: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3c60: 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68  R-39100-27317 Th
3c70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3c80: 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74  PCACHE_HDRSZ opt
3c90: 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20  ion takes.      
3ca0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61  ** a single para
3cb0: 6d 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61  meter which is a
3cc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3cd0: 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65  nteger and write
3ce0: 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  s into.      ** 
3cf0: 74 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65  that integer the
3d00: 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   number of extra
3d10: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
3d20: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
3d30: 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  h page.      ** 
3d40: 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  in SQLITE_CONFIG
3d50: 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20  _PAGECACHE. */. 
3d60: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3d70: 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20   int*) = .      
3d80: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
3d90: 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20  rSizeBtree() +. 
3da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3db0: 48 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65  HeaderSizePcache
3dc0: 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73  () +.          s
3dd0: 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65  qlite3HeaderSize
3de0: 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20  Pcache1();.     
3df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3e00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3e10: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
3e20: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3e30: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3e40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3e50: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3e60: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3e70: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3e80: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3e90: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3eb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ec0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
3ed0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3ee0: 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34  CE-OF: R-63325-4
3ef0: 38 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f  8378 The SQLITE_
3f00: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f  CONFIG_PCACHE2 o
3f10: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20  ption takes a.  
3f20: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72      ** single ar
3f30: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
3f40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
3f50: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3f60: 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a  ethods2.      **
3f70: 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62   object. This ob
3f80: 6a 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74  ject specifies t
3f90: 68 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  he interface to 
3fa0: 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61  a custom page ca
3fb0: 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  che.      ** imp
3fc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  lementation. */.
3fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3fe0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
3ff0: 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  2 = *va_arg(ap, 
4000: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
4010: 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20  ethods2*);.     
4020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4040: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a  NFIG_GETPCACHE2:
4050: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4060: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35  ENCE-OF: R-22035
4070: 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54  -46182 The SQLIT
4080: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
4090: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
40a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
40b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
40c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
40d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
40e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
40f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51     ** object. SQ
4100: 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Lite copies of t
4110: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
4120: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
4130: 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20  tion into.      
4140: 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20  ** that object. 
4150: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
4160: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4170: 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d  .pcache2.xInit==
4180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
4190: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
41a0: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
41b0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
41c0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
41d0: 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71  _methods2*) = sq
41e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
41f0: 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20  g.pcache2;.     
4200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f   break;.    }../
4210: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4220: 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65  -06626-12911 The
4230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
4240: 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e  EAP option is on
4250: 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ly.** available 
4260: 69 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  if SQLite is com
4270: 70 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65  piled with eithe
4280: 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  r SQLITE_ENABLE_
4290: 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51  MEMSYS3 or.** SQ
42a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
42b0: 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20  YS5 and returns 
42c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
42d0: 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73  invoked otherwis
42e0: 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e. */.#if define
42f0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4300: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
4310: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
4320: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
4330: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
4340: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
4350: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4360: 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68  R-19854-42126 Th
4370: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72  ere are three ar
4380: 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20  guments to.     
4390: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
43a0: 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74  G_HEAP: An 8-byt
43b0: 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65  e aligned pointe
43c0: 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c  r to the memory,
43d0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75   the.      ** nu
43e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
43f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66   the memory buff
4400: 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69  er, and the mini
4410: 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  mum allocation s
4420: 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ize. */.      sq
4430: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4440: 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.pHeap = va_arg
4450: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
4460: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4470: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
4480: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
44a0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
44b0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
44c0: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  );..      if( sq
44d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
44e0: 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20  g.mnReq<1 ){.   
44f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4500: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4510: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
4520: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4530: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31  lConfig.mnReq>(1
4540: 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20  <<12) ){.       
4550: 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75   /* cap min requ
4560: 65 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32  est size at 2^12
4570: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
4580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4590: 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b  mnReq = (1<<12);
45a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
45b0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
45c0: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30  lConfig.pHeap==0
45d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
45e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
45f0: 39 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65  920-60189 If the
4600: 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28   first pointer (
4610: 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74  the memory point
4620: 65 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  er).        ** i
4630: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c  s NULL, then SQL
4640: 69 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75  ite reverts to u
4650: 73 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74  sing its default
4660: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f   memory allocato
4670: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68  r.        ** (th
4680: 65 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28  e system malloc(
4690: 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
46a0: 29 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70  ), undoing any p
46b0: 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rior invocation 
46c0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51  of.        ** SQ
46d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
46e0: 4f 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  OC..        **. 
46f0: 20 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e         ** Settin
4700: 67 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g sqlite3GlobalC
4710: 6f 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a  onfig.m to all z
4720: 65 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20  eros will cause 
4730: 6d 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20  malloc to.      
4740: 20 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69    ** revert to i
4750: 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65  ts default imple
4760: 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73  mentation when s
4770: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
4780: 65 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20  e() is run.     
4790: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
47a0: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
47b0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
47c0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
47d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
47e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
47f0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
4800: 2d 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39  -OF: R-61006-089
4810: 31 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79  18 If the memory
4820: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
4830: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20  NULL then the.  
4840: 20 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61        ** alterna
4850: 74 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  tive memory allo
4860: 63 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64  cator is engaged
4870: 20 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f   to handle all o
4880: 66 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20  f SQLites.      
4890: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
48a0: 63 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f  cation needs. */
48b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
48c0: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20  NABLE_MEMSYS3.  
48d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
48e0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73  balConfig.m = *s
48f0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
4900: 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ys3();.#endif.#i
4910: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4920: 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20  LE_MEMSYS5.     
4930: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4940: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
4950: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35  te3MemGetMemsys5
4960: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ();.#endif.     
4970: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4980: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4990: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
49a0: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
49b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
49c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
49d0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
49e0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
49f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4a00: 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20  nfig.nLookaside 
4a10: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4a20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4a30: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
4a40: 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  * Record a point
4a50: 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72  er to the logger
4a60: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74   function and it
4a70: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
4a80: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66  ..    ** The def
4a90: 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c  ault is NULL.  L
4aa0: 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c  ogging is disabl
4ab0: 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ed if the functi
4ac0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20  on pointer is.  
4ad0: 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a    ** NULL..    *
4ae0: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
4af0: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a  E_CONFIG_LOG: {.
4b00: 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
4b10: 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
4b20: 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
4b30: 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
4b40: 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
4b50: 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
4b60: 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
4b70: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
4b80: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
4b90: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4ba0: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  (*)(void*,int,co
4bb0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
4bc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
4bd0: 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e  def void(*LOGFUN
4be0: 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  C_t)(void*,int,c
4bf0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
4c00: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4c10: 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61  Config.xLog = va
4c20: 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43  _arg(ap, LOGFUNC
4c30: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
4c40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4c50: 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  LogArg = va_arg(
4c60: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
4c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4c80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c90: 4f 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31  OF: R-55548-3381
4ca0: 37 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69  7 The compile-ti
4cb0: 6d 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55  me setting for U
4cc0: 52 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20  RI filenames.   
4cd0: 20 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67   ** can be chang
4ce0: 65 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65  ed at start-time
4cf0: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a   using the.    *
4d00: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
4d10: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55  (SQLITE_CONFIG_U
4d20: 52 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20  RI,1) or.    ** 
4d30: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
4d40: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
4d50: 2c 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ,0) configuratio
4d60: 6e 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  n calls..    */.
4d70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4d80: 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20  CONFIG_URI: {.  
4d90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4da0: 4f 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32  OF: R-25451-6112
4db0: 35 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  5 The SQLITE_CON
4dc0: 46 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74  FIG_URI option t
4dd0: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20  akes a single.  
4de0: 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20      ** argument 
4df0: 6f 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20  of type int. If 
4e00: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55  non-zero, then U
4e10: 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67  RI handling is g
4e20: 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  lobally.      **
4e30: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65   enabled. If the
4e40: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65   parameter is ze
4e50: 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e  ro, then URI han
4e60: 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c  dling is globall
4e70: 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62  y.      ** disab
4e80: 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  led. */.      sq
4e90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4ea0: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
4eb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ed0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
4ee0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
4ef0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
4f00: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
4f10: 45 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32  E-OF: R-36592-02
4f20: 37 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43  772 The SQLITE_C
4f30: 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49  ONFIG_COVERING_I
4f40: 4e 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20  NDEX_SCAN.      
4f50: 2a 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  ** option takes 
4f60: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
4f70: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
4f80: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
4f90: 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f  s a.      ** boo
4fa0: 6c 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  lean in order to
4fb0: 20 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   enable or disab
4fc0: 6c 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f  le the use of co
4fd0: 76 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66  vering indices f
4fe0: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  or.      ** full
4ff0: 20 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20   table scans in 
5000: 74 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  the query optimi
5010: 7a 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  zer. */.      sq
5020: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5030: 67 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61  g.bUseCis = va_a
5040: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5060: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5070: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20  NABLE_SQLLOG.   
5080: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5090: 46 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20  FIG_SQLLOG: {.  
50a0: 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
50b0: 28 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28  (*SQLLOGFUNC_t)(
50c0: 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  void*, sqlite3*,
50d0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
50e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
5100: 71 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  qllog = va_arg(a
5110: 70 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29  p, SQLLOGFUNC_t)
5120: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5130: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
5140: 6c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  logArg = va_arg(
5150: 61 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20  ap, void *);.   
5160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5170: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
5180: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5190: 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
51a0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
51b0: 3a 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20  : R-58063-38258 
51c0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
51d0: 41 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77  AP_SIZE takes tw
51e0: 6f 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  o 64-bit.      *
51f0: 2a 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74  * integer (sqlit
5200: 65 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73  e3_int64) values
5210: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65   that are the de
5220: 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20  fault mmap size 
5230: 6c 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28  limit.      ** (
5240: 74 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  the default sett
5250: 69 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d  ing for PRAGMA m
5260: 6d 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68  map_size) and th
5270: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5280: 64 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20  d.      ** mmap 
5290: 73 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20  size limit. */. 
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
52b0: 36 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61  64 szMmap = va_a
52c0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
52d0: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt64);.      sql
52e0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61  ite3_int64 mxMma
52f0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
5300: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
5310: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5320: 2d 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31  -OF: R-53367-431
5330: 39 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67  90 If either arg
5340: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70  ument to this op
5350: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  tion is.      **
5360: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
5370: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73  that argument is
5380: 20 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20   changed to its 
5390: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66  compile-time def
53a0: 61 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ault..      **. 
53b0: 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
53c0: 2d 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30  -OF: R-34993-450
53d0: 33 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61  31 The maximum a
53e0: 6c 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65  llowed mmap size
53f0: 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a   will be.      *
5400: 2a 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63  * silently trunc
5410: 61 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  ated if necessar
5420: 79 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  y so that it doe
5430: 73 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65  s not exceed the
5440: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
5450: 65 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d  e-time maximum m
5460: 6d 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20  map size set by 
5470: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  the SQLITE_MAX_M
5480: 4d 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a  MAP_SIZE.      *
5490: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
54a0: 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
54b0: 20 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70        if( mxMmap
54c0: 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c  <0 || mxMmap>SQL
54d0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
54e0: 45 20 29 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c  E ) mxMmap = SQL
54f0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
5500: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  E;.      if( szM
5510: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
5520: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
5530: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5540: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
5550: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
5560: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
5570: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5580: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
55a0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
55b0: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
55c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
55d0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
55e0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
55f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5600: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5610: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5620: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5630: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5640: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5650: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5660: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5670: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5680: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5690: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
56a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
56b0: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
56c0: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
56d0: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
56e0: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
56f0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5700: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5710: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5720: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5730: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5740: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5750: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5760: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5770: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5780: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5790: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
57a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
57b0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
57c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
57d0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
57e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
57f0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
5800: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5810: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20  *.** Set up the 
5820: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
5830: 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  s for a database
5840: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20   connection..** 
5850: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
5860: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a   on success.  .*
5870: 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69  * If lookaside i
5880: 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
5890: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
58a0: 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BUSY..**.** The 
58b0: 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  sz parameter is 
58c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
58d0: 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b  tes in each look
58e0: 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54  aside slot..** T
58f0: 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72  he cnt parameter
5900: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5910: 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74  f slots.  If pSt
5920: 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a  art is NULL the.
5930: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
5940: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
5950: 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
5960: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
5970: 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72  c()..** If pStar
5980: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
5990: 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20  en it is sz*cnt 
59a0: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
59b0: 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68  to use for.** th
59c0: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
59d0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
59e0: 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  t setupLookaside
59f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
5a00: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a  id *pBuf, int sz
5a10: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f  , int cnt){.  vo
5a20: 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66  id *pStart;.  if
5a30: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
5a40: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nOut ){.    retu
5a50: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5a60: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
5a70: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
5a80: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
5a90: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
5aa0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
5ab0: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
5ac0: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
5ad0: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
5ae0: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
5af0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
5b00: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
5b10: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
5b20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
5b30: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
5b40: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
5b50: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
5b60: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
5b70: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
5b80: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
5b90: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
5ba0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
5bb0: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
5bc0: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
5bd0: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
5be0: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
5bf0: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
5c00: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
5c10: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
5c20: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
5c30: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
5c40: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
5c50: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
5c60: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
5c70: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
5c80: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
5c90: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
5ca0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
5cb0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
5cc0: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
5cd0: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
5ce0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
5cf0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
5d00: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
5d10: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
5d20: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
5d30: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
5d40: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
5d50: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
5d60: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
5d70: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
5d80: 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20  ide.pFree = 0;. 
5d90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
5da0: 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69  z = (u16)sz;.  i
5db0: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
5dc0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b   int i;.    Look
5dd0: 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20  asideSlot *p;.  
5de0: 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28    assert( sz > (
5df0: 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61  int)sizeof(Looka
5e00: 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20  sideSlot*) );.  
5e10: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
5e20: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
5e30: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
5e40: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
5e50: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
5e60: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b  lookaside.pFree;
5e70: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
5e80: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a  side.pFree = p;.
5e90: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
5ea0: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
5eb0: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
5ec0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
5ed0: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
5ee0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
5ef0: 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64  abled = 1;.    d
5f00: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
5f10: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
5f20: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
5f30: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
5f40: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
5f50: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
5f60: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
5f70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
5f80: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  nabled = 0;.    
5f90: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
5fa0: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d  alloced = 0;.  }
5fb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5fc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
5fd0: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
5fe0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
5ff0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6000: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
6010: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
6020: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
6030: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
6040: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
6050: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6060: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6070: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
6080: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
6090: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
60a0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
60b0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
60c0: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ex;.}../*.** Fre
60d0: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
60e0: 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72  ory as we can fr
60f0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  om the given dat
6100: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
6110: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
6120: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
6130: 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64  emory(sqlite3 *d
6140: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  b){.  int i;..#i
6150: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6160: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6170: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6180: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
6190: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
61a0: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
61b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
61c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
61d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
61e0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
61f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
6200: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
6210: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
6220: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
6230: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
6240: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6250: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6260: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
6270: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
6280: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
6290: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
62a0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
62b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
62c0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
62d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
62e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
62f0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
6300: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
6310: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
6320: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
6330: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
6340: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
6350: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
6360: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6370: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
6380: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
6390: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
63a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
63b0: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
63c0: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
63d0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
63e0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
63f0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
6400: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
6410: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6420: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
6430: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
6440: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
6450: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6460: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
6470: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
6480: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
6490: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
64a0: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
64b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
64c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
64d0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
64e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
64f0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
6500: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
6510: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
6520: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
6530: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
6540: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
6550: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
6560: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
6570: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6580: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6590: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
65a0: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
65b0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
65c0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
65d0: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
65e0: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
65f0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
6600: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
6610: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
6620: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
6630: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
6640: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
6650: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
6660: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
6670: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
6680: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
6690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
66a0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
66b0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
66c0: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
66d0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
66e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
66f0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
6700: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
6710: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
6720: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
6730: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
6740: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
6750: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
6760: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
6770: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6780: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
6790: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
67a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
67b0: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
67c0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
67d0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
67e0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
67f0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
6800: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
6810: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
6820: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
6830: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
6840: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
6850: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6860: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6870: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
6880: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
68a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
68b0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
68c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
68d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
68e0: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
68f0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
6900: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
6910: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
6920: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
6930: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
6940: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
6950: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
6960: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
6970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
6980: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
6990: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
69a0: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
69b0: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
69c0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
69d0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
69e0: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
69f0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
6a00: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
6a10: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
6a20: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
6a30: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
6a40: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
6a50: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
6a60: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
6a70: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
6a80: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
6a90: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
6aa0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
6ab0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
6ac0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
6ad0: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
6ae0: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
6af0: 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  y2;.  /* EVIDENC
6b00: 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38  E-OF: R-65033-28
6b10: 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e  449 The built-in
6b20: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
6b30: 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20  n compares.  ** 
6b40: 73 74 72 69 6e 67 73 20 62 79 74 65 20 62 79 20  strings byte by 
6b50: 62 79 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d  byte using the m
6b60: 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e  emcmp() function
6b70: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
6b80: 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72  rd C.  ** librar
6b90: 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d  y. */.  rc = mem
6ba0: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
6bb0: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
6bc0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
6bd0: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
6be0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
6bf0: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
6c00: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
6c10: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
6c20: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
6c30: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45     ){.      /* E
6c40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
6c50: 36 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20  624-24737 RTRIM 
6c60: 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65  is like BINARY e
6c70: 78 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61  xcept that extra
6c80: 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73  .      ** spaces
6c90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
6ca0: 69 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20  ither string do 
6cb0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72  not change the r
6cc0: 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a  esult. In other.
6cd0: 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20        ** words, 
6ce0: 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d  strings will com
6cf0: 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e  pare equal to on
6d00: 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  e another as lon
6d10: 67 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20  g as they.      
6d20: 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69  ** differ only i
6d30: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6d40: 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e  spaces at the en
6d50: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
6d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
6d70: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
6d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6d90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6da0: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
6db0: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
6dc0: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
6dd0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
6de0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
6df0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
6e00: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
6e10: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
6e20: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
6e30: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
6e40: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
6e50: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
6e60: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
6e70: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
6e80: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
6e90: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
6ea0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
6eb0: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
6ec0: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
6ed0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
6ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
6ef0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
6f00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
6f10: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
6f20: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
6f30: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
6f40: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
6f50: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
6f60: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
6f70: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
6f80: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
6f90: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
6fa0: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
6fb0: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
6fc0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
6fd0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
6fe0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
6ff0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
7000: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
7010: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
7020: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
7030: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
7040: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
7050: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7060: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7070: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7080: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7090: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
70a0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
70b0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
70c0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
70d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
70e0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
70f0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
7100: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
7110: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7120: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
7130: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7140: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7150: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
7160: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
7170: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7180: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7190: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
71a0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
71b0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
71c0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
71d0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
71e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
71f0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7200: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
7210: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7220: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
7230: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
7240: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
7250: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
7260: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
7270: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
7280: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
7290: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
72a0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
72b0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
72c0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
72d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
72e0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
72f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
7300: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
7310: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
7320: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
7330: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
7340: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
7350: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
7360: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
7370: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
7380: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
7390: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
73a0: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
73b0: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
73c0: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
73d0: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
73e0: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
73f0: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
7400: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
7410: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
7420: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
7430: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
7440: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
7450: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
7460: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
7470: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
7480: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
7490: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
74a0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
74b0: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
74c0: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
74d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
74e0: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
74f0: 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  r function assoc
7500: 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44  iated with FuncD
7510: 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78  ef p, if any. Ex
7520: 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73  cept,.** if this
7530: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
7540: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e   copy of the fun
7550: 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e  ction, do not in
7560: 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c  voke it. Multipl
7570: 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61  e.** copies of a
7580: 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e   single function
7590: 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65   are created whe
75a0: 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  n create_functio
75b0: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  n() is called.**
75c0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59   with SQLITE_ANY
75d0: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
75e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
75f0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
7600: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
7610: 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e  ncDef *p){.  Fun
7620: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
7630: 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44  structor = p->pD
7640: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28  estructor;.  if(
7650: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
7660: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
7670: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7680: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
7690: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ef==0 ){.      p
76a0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73  Destructor->xDes
76b0: 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72  troy(pDestructor
76c0: 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20  ->pUserData);.  
76d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
76e0: 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f  e(db, pDestructo
76f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
7700: 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63  ./*.** Disconnec
7710: 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74  t all sqlite3_vt
7720: 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ab objects that 
7730: 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61  belong to databa
7740: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
7750: 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c   db. This is cal
7760: 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62  led when db is b
7770: 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  eing closed..*/.
7780: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63  static void disc
7790: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71  onnectAllVtab(sq
77a0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e  lite3 *db){.#ifn
77b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
77d0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt i;.  sqlite3B
77e0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
77f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
7800: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
7810: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
7820: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  a = db->aDb[i].p
7830: 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20  Schema;.    if( 
7840: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
7850: 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68  ma ){.      Hash
7860: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66  Elem *p;.      f
7870: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
7880: 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  irst(&pSchema->t
7890: 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71  blHash); p; p=sq
78a0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
78b0: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
78c0: 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a  *pTab = (Table *
78d0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
78e0: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
78f0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
7900: 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73  ) sqlite3VtabDis
7910: 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62  connect(db, pTab
7920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7930: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
7940: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
7950: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
7960: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65  LeaveAll(db);.#e
7970: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
7980: 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64  AMETER(db);.#end
7990: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
79a0: 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62  rn TRUE if datab
79b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
79c0: 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65  b has unfinalize
79d0: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
79e0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
79f0: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
7a00: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20  ackup objects.  
7a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
7a20: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
7a30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
7a40: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
7a50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7a60: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
7a70: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
7a80: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
7a90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
7aa0: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; j++){.    Bt
7ab0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
7ac0: 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[j].pBt;.    i
7ad0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
7ae0: 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70  3BtreeIsInBackup
7af0: 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31  (pBt) ) return 1
7b00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7b20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c   an existing SQL
7b30: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  ite database.*/.
7b40: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
7b50: 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  e3Close(sqlite3 
7b60: 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f  *db, int forceZo
7b70: 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62  mbie){.  if( !db
7b80: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
7b90: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d  NCE-OF: R-63257-
7ba0: 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71  11740 Calling sq
7bb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72  lite3_close() or
7bc0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
7bd0: 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20  close_v2() with 
7be0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
7bf0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72  rgument is a har
7c00: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a  mless no-op. */.
7c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7c20: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
7c30: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7c40: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
7c50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7c60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
7c70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
7c80: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7c90: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f  mutex);..  /* Fo
7ca0: 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  rce xDisconnect 
7cb0: 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72  calls on all vir
7cc0: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tual tables */. 
7cd0: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
7ce0: 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ab(db);..  /* If
7cf0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7d00: 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63  s open, the disc
7d10: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20  onnectAllVtab() 
7d20: 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20  call above.  ** 
7d30: 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61  will not have ca
7d40: 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e  lled the xDiscon
7d50: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e  nect() method on
7d60: 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a   any virtual.  *
7d70: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
7d80: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
7d90: 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ray. The followi
7da0: 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  ng sqlite3VtabRo
7db0: 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61  llback().  ** ca
7dc0: 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57  ll will do so. W
7dd0: 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
7de0: 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65  s before the che
7df0: 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20  ck for active.  
7e00: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
7e10: 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20  s below, as the 
7e20: 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  v-table implemen
7e30: 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74  tation may be st
7e40: 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20  oring.  ** some 
7e50: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
7e60: 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  nts internally..
7e70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74    */.  sqlite3Vt
7e80: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
7e90: 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68  .  /* Legacy beh
7ea0: 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63  avior (sqlite3_c
7eb0: 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29  lose() behavior)
7ec0: 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20   is to return.  
7ed0: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
7ee0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
7ef0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73   can not be clos
7f00: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
7f10: 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63    */.  if( !forc
7f20: 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65  eZombie && conne
7f30: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
7f40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
7f50: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
7f60: 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61  QLITE_BUSY, "una
7f70: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
7f80: 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20   to unfinalized 
7f90: 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d  ".       "statem
7fa0: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
7fb0: 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20  ed backups");.  
7fc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7fd0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7fe0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
7ff0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23  ITE_BUSY;.  }..#
8000: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8010: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28  BLE_SQLLOG.  if(
8020: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
8030: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a  nfig.xSqllog ){.
8040: 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74      /* Closing t
8050: 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  he handle. Fourt
8060: 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
8070: 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20  assed the value 
8080: 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  2. */.    sqlite
8090: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
80a0: 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f  qllog(sqlite3Glo
80b0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
80c0: 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b  gArg, db, 0, 2);
80d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
80e0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f  * Convert the co
80f0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20  nnection into a 
8100: 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20  zombie and then 
8110: 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  close it..  */. 
8120: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
8130: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
8140: 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65  ;.  sqlite3Leave
8150: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8160: 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  bie(db);.  retur
8170: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8180: 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74  /*.** Two variat
8190: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c  ions on the publ
81a0: 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72  ic interface for
81b0: 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62   closing a datab
81c0: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
81d0: 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  n. The sqlite3_c
81e0: 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72  lose() version r
81f0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
8200: 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73  SY and.** leaves
8210: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8220: 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  option if there 
8230: 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  are unfinalized 
8240: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
8250: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
8260: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
8270: 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74  kups.  The sqlit
8280: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a  e3_close_v2().**
8290: 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20   version forces 
82a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
82b0: 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69  o become a zombi
82c0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  e if there are.*
82d0: 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75  * unclosed resou
82e0: 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67  rces, and arrang
82f0: 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74  es for deallocat
8300: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ion when the las
8310: 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61  t.** prepare sta
8320: 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65  tement or sqlite
8330: 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e  3_backup closes.
8340: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8350: 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  close(sqlite3 *d
8360: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
8370: 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d  e3Close(db,0); }
8380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
8390: 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64  se_v2(sqlite3 *d
83a0: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
83b0: 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d  e3Close(db,1); }
83c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  .../*.** Close t
83d0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
83e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
83f0: 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65  db..**.** Furthe
8400: 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61  rmore, if databa
8410: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
8420: 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65   is a zombie (me
8430: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65  aning that there
8440: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70  .** has been a p
8450: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
8460: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f  ite3_close(db) o
8470: 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  r sqlite3_close_
8480: 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65  v2(db)) and.** e
8490: 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d  very sqlite3_stm
84a0: 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66  t has now been f
84b0: 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65  inalized and eve
84c0: 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ry sqlite3_backu
84d0: 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65  p has.** finishe
84e0: 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c  d, then free all
84f0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76   resources..*/.v
8500: 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65  oid sqlite3Leave
8510: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8520: 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  bie(sqlite3 *db)
8530: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
8560: 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e iterator */.  
8570: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20  int j;..  /* If 
8580: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
8590: 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74  nding sqlite3_st
85a0: 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  mt or sqlite3_ba
85b0: 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a  ckup objects.  *
85c0: 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e  * or if the conn
85d0: 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  ection has not y
85e0: 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62  et been closed b
85f0: 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  y sqlite3_close_
8600: 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  v2(),.  ** then 
8610: 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d  just leave the m
8620: 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e  utex and return.
8630: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
8640: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
8650: 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f  GIC_ZOMBIE || co
8660: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
8670: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
8680: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
8690: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
86a0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
86b0: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
86c0: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
86d0: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
86e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
86f0: 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c  s.  ** closed al
8700: 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61  l sqlite3_stmt a
8710: 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  nd sqlite3_backu
8720: 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61  p objects and ha
8730: 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73  s been.  ** pass
8740: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ed to sqlite3_cl
8750: 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ose (meaning tha
8760: 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65  t it is a zombie
8770: 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20  ).  Therefore,. 
8780: 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64   ** go ahead and
8790: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
87a0: 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ces..  */..  /* 
87b0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
87c0: 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69   is open, roll i
87d0: 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73  t back. This als
87e0: 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69  o ensures that i
87f0: 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62  f.  ** any datab
8800: 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65  ase schemas have
8810: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62   been modified b
8820: 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64  y an uncommitted
8830: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
8840: 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74  * they are reset
8850: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72  . And that the r
8860: 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d  equired b-tree m
8870: 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20  utex is held to 
8880: 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  make.  ** the pa
8890: 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ger rollback and
88a0: 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e   schema reset an
88b0: 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f   atomic operatio
88c0: 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52  n. */.  sqlite3R
88d0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
88e0: 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a  QLITE_OK);..  /*
88f0: 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61   Free any outsta
8900: 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20  nding Savepoint 
8910: 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20  structures. */. 
8920: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
8930: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20  epoints(db);..  
8940: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74  /* Close all dat
8950: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8960: 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  s */.  for(j=0; 
8970: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
8980: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
8990: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a  pDb = &db->aDb[j
89a0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
89b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
89c0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
89d0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
89e0: 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20  pDb->pBt = 0;.  
89f0: 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a      if( j!=1 ){.
8a00: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63          pDb->pSc
8a10: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
8a20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
8a30: 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20   Clear the TEMP 
8a40: 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c  schema separatel
8a50: 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20  y and last */.  
8a60: 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
8a70: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71  Schema ){.    sq
8a80: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
8a90: 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  (db->aDb[1].pSch
8aa0: 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ema);.  }.  sqli
8ab0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
8ac0: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  t(db);..  /* Fre
8ad0: 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f  e up the array o
8ae0: 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  f auxiliary data
8af0: 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  bases */.  sqlit
8b00: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
8b10: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61  seArray(db);.  a
8b20: 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d  ssert( db->nDb<=
8b30: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  2 );.  assert( d
8b40: 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53  b->aDb==db->aDbS
8b50: 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54  tatic );..  /* T
8b60: 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ell the code in 
8b70: 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68  notify.c that th
8b80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20  e connection no 
8b90: 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79  longer holds any
8ba0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20  .  ** locks and 
8bb0: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
8bc0: 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c   any further unl
8bd0: 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
8be0: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  acks..  */.  sql
8bf0: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  ite3ConnectionCl
8c00: 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72  osed(db);..  for
8c10: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
8c20: 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20  e(db->aFunc.a); 
8c30: 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  j++){.    FuncDe
8c40: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68  f *pNext, *pHash
8c50: 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  , *p;.    for(p=
8c60: 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20  db->aFunc.a[j]; 
8c70: 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20  p; p=pHash){.   
8c80: 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48     pHash = p->pH
8c90: 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ash;.      while
8ca0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( p ){.        f
8cb0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
8cc0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
8cd0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
8ce0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8cf0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
8d00: 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74         p = pNext
8d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8d20: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
8d30: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
8d40: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
8d50: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8d60: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
8d70: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
8d80: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
8d90: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
8da0: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
8db0: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
8dc0: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
8dd0: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
8de0: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
8df0: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
8e00: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
8e10: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
8e20: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
8e30: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
8e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8e60: 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, pColl);.  }.
8e70: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
8e80: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
8e90: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8ea0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8eb0: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
8ec0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
8ed0: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
8ee0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
8ef0: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
8f00: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
8f10: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
8f20: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
8f30: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
8f40: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
8f50: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
8f60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8f70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64  3DbFree(db, pMod
8f80: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8f90: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
8fa0: 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
8fb0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
8fc0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20  db, SQLITE_OK); 
8fd0: 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61  /* Deallocates a
8fe0: 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20  ny cached error 
8ff0: 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71  strings. */.  sq
9000: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64  lite3ValueFree(d
9010: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69  b->pErr);.  sqli
9020: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
9030: 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49  ns(db);.#if SQLI
9040: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
9050: 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  CATION.  sqlite3
9060: 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a  _free(db->auth.z
9070: 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c  AuthUser);.  sql
9080: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
9090: 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e  th.zAuthPW);.#en
90a0: 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  dif..  db->magic
90b0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
90c0: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
90d0: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
90e0: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
90f0: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
9100: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
9110: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
9120: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
9130: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
9140: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
9150: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
9160: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
9170: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
9180: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
9190: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
91a0: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
91b0: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
91c0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
91d0: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
91e0: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
91f0: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
9200: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
9210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
9220: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
9230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9240: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9250: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
9260: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
9270: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
9280: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
9290: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
92a0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
92b0: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
92c0: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
92d0: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
92e0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
92f0: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
9300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9310: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
9320: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
9330: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
9340: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  b);.}../*.** Rol
9350: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
9360: 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72  se files.  If tr
9370: 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
9380: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a  LITE_OK, then.**
9390: 20 61 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f   any write curso
93a0: 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
93b0: 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20  ed ("tripped" - 
93c0: 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20  as in "tripping 
93d0: 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65  a circuit.** bre
93e0: 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20  aker") and made 
93f0: 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f  to return tripCo
9400: 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  de if there are 
9410: 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61  any further.** a
9420: 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74  ttempts to use t
9430: 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61  hat cursor.  Rea
9440: 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e  d cursors remain
9450: 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a   open and valid.
9460: 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61 76 65  ** but are "save
9470: 64 22 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  d" in case the t
9480: 61 62 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d  able pages are m
9490: 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a  oved around..*/.
94a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
94b0: 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20  backAll(sqlite3 
94c0: 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64  *db, int tripCod
94d0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
94e0: 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  nt inTrans = 0;.
94f0: 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e    int schemaChan
9500: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
9510: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9520: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
9530: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
9540: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
9550: 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d  /* Obtain all b-
9560: 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66  tree mutexes bef
9570: 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63  ore making any c
9580: 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c  alls to BtreeRol
9590: 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54  lback(). .  ** T
95a0: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
95b0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
95c0: 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72  nsaction being r
95d0: 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20  olled back has. 
95e0: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65   ** modified the
95f0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
9600: 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  . If the b-tree 
9610: 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20  mutexes are not 
9620: 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c  taken.  ** here,
9630: 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68   then another sh
9640: 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65  ared-cache conne
9650: 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61  ction might snea
9660: 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a  k in between.  *
9670: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  * the database r
9680: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
9690: 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20  ma reset, which 
96a0: 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a  can cause false.
96b0: 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
96c0: 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20  reports in some 
96d0: 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c  cases.  */.  sql
96e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
96f0: 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43  l(db);.  schemaC
9700: 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61  hange = (db->fla
9710: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
9720: 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26  rnChanges)!=0 &&
9730: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
9740: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
9750: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9760: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
9770: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9780: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
9790: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
97a0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
97b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e  {.        inTran
97c0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
97d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
97e0: 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69  eRollback(p, tri
97f0: 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68  pCode, !schemaCh
9800: 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ange);.    }.  }
9810: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
9820: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
9830: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
9840: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28  lloc();..  if( (
9850: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
9860: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21  _InternChanges)!
9870: 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 && db->init.b
9880: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  usy==0 ){.    sq
9890: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
98a0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
98b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
98c0: 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
98d0: 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20  onnection(db);. 
98e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
98f0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
9900: 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65    /* Any deferre
9910: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  d constraint vio
9920: 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77  lations have now
9930: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
9940: 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  */.  db->nDeferr
9950: 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  edCons = 0;.  db
9960: 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
9970: 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ns = 0;.  db->fl
9980: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
9990: 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49  eferFKs;..  /* I
99a0: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
99b0: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
99c0: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
99d0: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
99e0: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
99f0: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
9a00: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
9a10: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
9a20: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
9a30: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
9a40: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
9a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9a60: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
9a70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
9a80: 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
9a90: 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63  g to the error c
9aa0: 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ode.** specified
9ab0: 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
9ac0: 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65  ..*/.#if (define
9ad0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
9ae0: 26 26 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  && SQLITE_OS_WIN
9af0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
9b00: 49 54 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20  ITE_TEST).const 
9b10: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
9b20: 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20  Name(int rc){.  
9b30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9b40: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
9b50: 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66  origRc = rc;.  f
9b60: 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a  or(i=0; i<2 && z
9b70: 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63  Name==0; i++, rc
9b80: 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73   &= 0xff){.    s
9b90: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
9ba0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
9bb0: 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K:              
9bc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9bd0: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
9be0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9bf0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9c00: 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20  ERROR:          
9c10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9c20: 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20  ITE_ERROR";     
9c30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9c40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9c50: 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20  _INTERNAL:      
9c60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9c70: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20  LITE_INTERNAL"; 
9c80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9c90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9ca0: 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20  E_PERM:         
9cb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9cc0: 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20  QLITE_PERM";    
9cd0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9ce0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9cf0: 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20  TE_ABORT:       
9d00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9d10: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20  SQLITE_ABORT";  
9d20: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9d30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9d40: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
9d50: 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  CK:     zName = 
9d60: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  "SQLITE_ABORT_RO
9d70: 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61  LLBACK";    brea
9d80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d90: 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20  LITE_BUSY:      
9da0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9db0: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20   "SQLITE_BUSY"; 
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9dd0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9de0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
9df0: 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  ERY:      zName 
9e00: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  = "SQLITE_BUSY_R
9e10: 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72  ECOVERY";     br
9e20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9e30: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
9e40: 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SHOT:      zName
9e50: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
9e60: 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62  SNAPSHOT";     b
9e70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9e80: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20   SQLITE_LOCKED: 
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9ea0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b  e = "SQLITE_LOCK
9eb0: 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ED";            
9ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9ed0: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  e SQLITE_LOCKED_
9ee0: 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61  SHAREDCACHE: zNa
9ef0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
9f00: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 22  KED_SHAREDCACHE"
9f10: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
9f20: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9f40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
9f50: 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  MEM";           
9f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9f70: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
9f80: 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NLY:           z
9f90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
9fa0: 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20  EADONLY";       
9fb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9fc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
9fd0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  ONLY_RECOVERY:  
9fe0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9ff0: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
a000: 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Y"; break;.     
a010: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
a020: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20  DONLY_CANTLOCK: 
a030: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a040: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
a050: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
a060: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
a070: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a  ADONLY_ROLLBACK:
a080: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a090: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
a0a0: 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACK"; break;.   
a0b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a0c0: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a  EADONLY_DBMOVED:
a0d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a0e0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
a0f0: 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  VED";  break;.  
a100: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a110: 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20 20  INTERRUPT:      
a120: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a130: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20  ITE_INTERRUPT"; 
a140: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a150: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a160: 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20  _IOERR:         
a170: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a180: 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20  LITE_IOERR";    
a190: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a1a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a1b0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20  E_IOERR_READ:   
a1c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a1d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
a1e0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
a1f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a200: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
a210: 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  EAD:   zName = "
a220: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
a230: 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b  RT_READ";  break
a240: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a250: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a  ITE_IOERR_WRITE:
a260: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a270: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  "SQLITE_IOERR_WR
a280: 49 54 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  ITE";       brea
a290: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a2a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
a2b0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
a2c0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46   "SQLITE_IOERR_F
a2d0: 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65  SYNC";       bre
a2e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a2f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
a300: 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20  FSYNC:    zName 
a310: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a320: 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72  DIR_FSYNC";   br
a330: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a340: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
a350: 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65  NCATE:     zName
a360: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a370: 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62  _TRUNCATE";    b
a380: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a390: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
a3a0: 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  TAT:        zNam
a3b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a3c0: 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20 20  R_FSTAT";       
a3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a3e0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  e SQLITE_IOERR_U
a3f0: 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61  NLOCK:       zNa
a400: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a410: 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20  RR_UNLOCK";     
a420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a430: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a440: 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e  RDLOCK:       zN
a450: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a460: 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20  ERR_RDLOCK";    
a470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a480: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a490: 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a  _DELETE:       z
a4a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a4b0: 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20  OERR_DELETE";   
a4c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a4d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a4e0: 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  R_NOMEM:        
a4f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a500: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20  IOERR_NOMEM";   
a510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a520: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a530: 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20  RR_ACCESS:      
a540: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a550: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20  _IOERR_ACCESS"; 
a560: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a570: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a580: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
a590: 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  DLOCK:.         
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a5c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
a5d0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b  CKRESERVEDLOCK";
a5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a5f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a600: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  LOCK:         zN
a610: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a620: 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20  ERR_LOCK";      
a630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a640: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a650: 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a  _CLOSE:        z
a660: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a670: 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20  OERR_CLOSE";    
a680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a690: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a6a0: 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20  R_DIR_CLOSE:    
a6b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a6c0: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22  IOERR_DIR_CLOSE"
a6d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
a6e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a6f0: 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20  RR_SHMOPEN:     
a700: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a710: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b  _IOERR_SHMOPEN";
a720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a730: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a740: 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20  ERR_SHMSIZE:    
a750: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a760: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22  E_IOERR_SHMSIZE"
a770: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a780: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a790: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20  OERR_SHMLOCK:   
a7a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a7b0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
a7c0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a7d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a7e0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20  IOERR_SHMMAP:   
a7f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a800: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
a810: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a820: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a830: 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20  _IOERR_SEEK:    
a840: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a850: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22  LITE_IOERR_SEEK"
a860: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
a870: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a880: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
a890: 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  OENT: zName = "S
a8a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
a8b0: 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b  TE_NOENT";break;
a8c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a8d0: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20  TE_IOERR_MMAP:  
a8e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a8f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
a900: 50 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  P";        break
a910: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a920: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
a930: 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  PPATH:  zName = 
a940: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  "SQLITE_IOERR_GE
a950: 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61  TTEMPPATH"; brea
a960: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a970: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
a980: 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATH:     zName =
a990: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
a9a0: 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62 72 65  ONVPATH";    bre
a9b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a9c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20  QLITE_CORRUPT:  
a9d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a9e0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  = "SQLITE_CORRUP
a9f0: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  T";           br
aa00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aa10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
aa20: 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  TAB:       zName
aa30: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55   = "SQLITE_CORRU
aa40: 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62  PT_VTAB";      b
aa50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa60: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
aa70: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
aa80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46  e = "SQLITE_NOTF
aa90: 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20  OUND";          
aaa0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aab0: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
aad0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c  me = "SQLITE_FUL
aae0: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  L";             
aaf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ab00: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
ab10: 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  EN:           zN
ab20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
ab30: 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20  NTOPEN";        
ab40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ab50: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
ab60: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a  PEN_NOTEMPDIR: z
ab70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
ab80: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
ab90: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
aba0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
abb0: 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20  OPEN_ISDIR:     
abc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
abd0: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b  CANTOPEN_ISDIR";
abe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
abf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
ac00: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20  TOPEN_FULLPATH: 
ac10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac20: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
ac30: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
ac40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
ac50: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a  NTOPEN_CONVPATH:
ac60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac70: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
ac80: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
ac90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
aca0: 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20  ROTOCOL:        
acb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
acc0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20  TE_PROTOCOL";   
acd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ace0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
acf0: 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20 20 20  EMPTY:          
ad00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ad10: 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20  ITE_EMPTY";     
ad20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ad30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ad40: 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20  _SCHEMA:        
ad50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ad60: 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20  LITE_SCHEMA";   
ad70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ad80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad90: 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20  E_TOOBIG:       
ada0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
adb0: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20  QLITE_TOOBIG";  
adc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
add0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ade0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20  TE_CONSTRAINT:  
adf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ae00: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ae10: 54 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  T";        break
ae20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ae30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
ae40: 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20  NIQUE:  zName = 
ae50: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
ae60: 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61  NT_UNIQUE"; brea
ae70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae80: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
ae90: 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d  TRIGGER: zName =
aea0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
aeb0: 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65  INT_TRIGGER";bre
aec0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aed0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
aee0: 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20  _FOREIGNKEY:.   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
af10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
af20: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
af30: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
af40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af50: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
af60: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
af70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
af80: 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HECK";  break;. 
af90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
afa0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
afb0: 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  ARYKEY:.        
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
afe0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
aff0: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20  NT_PRIMARYKEY"; 
b000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b010: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b020: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  RAINT_NOTNULL: z
b030: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b040: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
b050: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
b060: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b070: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
b080: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b0b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
b0c0: 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65  MMITHOOK";   bre
b0d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b0e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b0f0: 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20  _VTAB:    zName 
b100: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b110: 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72  AINT_VTAB";   br
b120: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b130: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b140: 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  T_FUNCTION:.    
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b170: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b180: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22  TRAINT_FUNCTION"
b190: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b1a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b1b0: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a  ONSTRAINT_ROWID:
b1c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b1d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
b1e0: 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  WID";  break;.  
b1f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b200: 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20  MISMATCH:       
b210: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b220: 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20  ITE_MISMATCH";  
b230: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b240: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b250: 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20 20  _MISUSE:        
b260: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b270: 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20  LITE_MISUSE";   
b280: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b290: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b2a0: 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20  E_NOLFS:        
b2b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b2c0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20  QLITE_NOLFS";   
b2d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b2e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2f0: 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20  TE_AUTH:        
b300: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b310: 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20  SQLITE_AUTH";   
b320: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b330: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b340: 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20  ITE_FORMAT:     
b350: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b360: 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b  "SQLITE_FORMAT";
b370: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b380: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b390: 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20  LITE_RANGE:     
b3a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b3b0: 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b   "SQLITE_RANGE";
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b3d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3e0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20  QLITE_NOTADB:   
b3f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b400: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  = "SQLITE_NOTADB
b410: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b420: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b430: 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20  SQLITE_ROW:     
b440: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b450: 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b   = "SQLITE_ROW";
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
b470: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b480: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20   SQLITE_NOTICE: 
b490: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b4a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
b4b0: 43 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  CE";            
b4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b4d0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  e SQLITE_NOTICE_
b4e0: 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61  RECOVER_WAL: zNa
b4f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
b500: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22  ICE_RECOVER_WAL"
b510: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b520: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
b530: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
b540: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b570: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
b580: 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  R_ROLLBACK"; bre
b590: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b5a0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20  QLITE_WARNING:  
b5b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b5c0: 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  = "SQLITE_WARNIN
b5d0: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  G";           br
b5e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b5f0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
b600: 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65  UTOINDEX:  zName
b610: 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49   = "SQLITE_WARNI
b620: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62  NG_AUTOINDEX"; b
b630: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b640: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20   SQLITE_DONE:   
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b660: 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45  e = "SQLITE_DONE
b670: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
b680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
b690: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
b6a0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
b6b0: 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20  ar zBuf[50];.   
b6c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b6d0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
b6e0: 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e  zBuf, "SQLITE_UN
b6f0: 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67  KNOWN(%d)", orig
b700: 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  Rc);.    zName =
b710: 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74   zBuf;.  }.  ret
b720: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
b730: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b740: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
b750: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
b760: 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
b770: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
b780: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
b790: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
b7a0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e  sqlite3ErrStr(in
b7b0: 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20  t rc){.  static 
b7c0: 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73  const char* cons
b7d0: 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20  t aMsg[] = {.   
b7e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20   /* SQLITE_OK   
b7f0: 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61         */ "not a
b800: 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  n error",.    /*
b810: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20   SQLITE_ERROR   
b820: 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69      */ "SQL logi
b830: 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69  c error or missi
b840: 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ng database",.  
b850: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
b860: 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20  RNAL    */ 0,.  
b870: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d    /* SQLITE_PERM
b880: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65          */ "acce
b890: 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65  ss permission de
b8a0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
b8b0: 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20  LITE_ABORT      
b8c0: 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65   */ "callback re
b8d0: 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62  quested query ab
b8e0: 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ort",.    /* SQL
b8f0: 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20  ITE_BUSY        
b900: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20  */ "database is 
b910: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
b920: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20  SQLITE_LOCKED   
b930: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
b940: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22  table is locked"
b950: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
b960: 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22  NOMEM       */ "
b970: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a  out of memory",.
b980: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45      /* SQLITE_RE
b990: 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74  ADONLY    */ "at
b9a0: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
b9b0: 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61   readonly databa
b9c0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
b9d0: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a  TE_INTERRUPT   *
b9e0: 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c  / "interrupted",
b9f0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
ba00: 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64  OERR       */ "d
ba10: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a  isk I/O error",.
ba20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
ba30: 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61  RRUPT     */ "da
ba40: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
ba50: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c  e is malformed",
ba60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
ba70: 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75  OTFOUND    */ "u
ba80: 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e  nknown operation
ba90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
baa0: 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20  _FULL        */ 
bab0: 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73  "database or dis
bac0: 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20  k is full",.    
bad0: 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  /* SQLITE_CANTOP
bae0: 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65  EN    */ "unable
baf0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
bb00: 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20  e file",.    /* 
bb10: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20  SQLITE_PROTOCOL 
bb20: 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70     */ "locking p
bb30: 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a  rotocol",.    /*
bb40: 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20   SQLITE_EMPTY   
bb50: 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f      */ "table co
bb60: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c  ntains no data",
bb70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53  .    /* SQLITE_S
bb80: 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64  CHEMA      */ "d
bb90: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
bba0: 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20  as changed",.   
bbb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   /* SQLITE_TOOBI
bbc0: 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e  G      */ "strin
bbd0: 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69  g or blob too bi
bbe0: 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  g",.    /* SQLIT
bbf0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f  E_CONSTRAINT  */
bc00: 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   "constraint fai
bc10: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
bc20: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20  ITE_MISMATCH    
bc30: 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73  */ "datatype mis
bc40: 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53  match",.    /* S
bc50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20  QLITE_MISUSE    
bc60: 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f    */ "library ro
bc70: 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74  utine called out
bc80: 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20   of sequence",. 
bc90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
bca0: 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72  FS       */ "lar
bcb0: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
bcc0: 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20  is disabled",.  
bcd0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48    /* SQLITE_AUTH
bce0: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68          */ "auth
bcf0: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64  orization denied
bd00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bd10: 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20  _FORMAT      */ 
bd20: 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62  "auxiliary datab
bd30: 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72  ase format error
bd40: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bd50: 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20  _RANGE       */ 
bd60: 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20  "bind or column 
bd70: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
bd80: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
bd90: 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a  TE_NOTADB      *
bda0: 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79  / "file is encry
bdb0: 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61  pted or is not a
bdc0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b   database",.  };
bdd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bde0: 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65  Err = "unknown e
bdf0: 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28  rror";.  switch(
be00: 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20   rc ){.    case 
be10: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
be20: 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a  LBACK: {.      z
be30: 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65  Err = "abort due
be40: 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   to ROLLBACK";. 
be50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
be60: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
be70: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
be80: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
be90: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
bea0: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
beb0: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
bec0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
bed0: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
bee0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
bef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bf00: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
bf10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bf20: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
bf30: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
bf40: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
bf50: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
bf60: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
bf70: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
bf80: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
bf90: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
bfa0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
bfb0: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
bfc0: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
bfd0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
bfe0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
bff0: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
c000: 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20  ck(. void *ptr, 
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c020: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
c030: 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75  tion */. int cou
c040: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
c050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
c060: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
c070: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23  een busy */.){.#
c080: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
c090: 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56   || (defined(HAV
c0a0: 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
c0b0: 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74  E_USLEEP).  stat
c0c0: 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61  ic const u8 dela
c0d0: 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c  ys[] =.     { 1,
c0e0: 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32   2, 5, 10, 15, 2
c0f0: 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20  0, 25, 25,  25, 
c100: 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b   50,  50, 100 };
c110: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
c120: 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20  u8 totals[] =.  
c130: 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38     { 0, 1, 3,  8
c140: 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38  , 18, 33, 53, 78
c150: 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c  , 103, 128, 178,
c160: 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65   228 };.# define
c170: 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a   NDELAY ArraySiz
c180: 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69  e(delays).  sqli
c190: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
c1a0: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
c1b0: 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75  timeout = db->bu
c1c0: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74  syTimeout;.  int
c1d0: 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a   delay, prior;..
c1e0: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
c1f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
c200: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
c210: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
c220: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
c230: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
c240: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
c250: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
c260: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
c270: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
c280: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
c290: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
c2a0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
c2b0: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69  ior + delay > ti
c2c0: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c  meout ){.    del
c2d0: 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70  ay = timeout - p
c2e0: 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65  rior;.    if( de
c2f0: 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  lay<=0 ) return 
c300: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
c310: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
c320: 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20  , delay*1000);. 
c330: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65   return 1;.#else
c340: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c350: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
c360: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
c370: 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72   ((sqlite3 *)ptr
c380: 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  )->busyTimeout;.
c390: 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a    if( (count+1)*
c3a0: 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29  1000 > timeout )
c3b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c3c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
c3d0: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31  leep(db->pVfs, 1
c3e0: 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72  000000);.  retur
c3f0: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
c400: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
c410: 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c  given busy handl
c420: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
c430: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
c440: 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69   when an operati
c450: 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  on failed with a
c460: 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69   lock..** If thi
c470: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
c480: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
c490: 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e  lock is retried.
c4a0: 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72    If it.** retur
c4b0: 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74  ns 0, the operat
c4c0: 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20  ion aborts with 
c4d0: 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  an SQLITE_BUSY e
c4e0: 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
c4f0: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
c500: 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65  ndler(BusyHandle
c510: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  r *p){.  int rc;
c520: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
c530: 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d  0) || p->xFunc==
c540: 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20  0 || p->nBusy<0 
c550: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
c560: 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70   = p->xFunc(p->p
c570: 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a  Arg, p->nBusy);.
c580: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
c590: 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31     p->nBusy = -1
c5a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c5b0: 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20  ->nBusy++;.  }. 
c5c0: 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a   return rc; .}..
c5d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c5e0: 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79  ne sets the busy
c5f0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
c600: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
c610: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
c620: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
c630: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
c640: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
c650: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
c660: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
c670: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a  e3 *db,.  int (*
c680: 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74  xBusy)(void*,int
c690: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
c6a0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
c6b0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
c6c0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
c6d0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
c6e0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
c6f0: 45 5f 4d 49 53 55 53 45 3b 0a 23 65 6e 64 69 66  E_MISUSE;.#endif
c700: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c710: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
c720: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
c730: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
c740: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
c750: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
c760: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
c770: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
c780: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
c790: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
c7a0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c7b0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c7c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c7d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c7e0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
c7f0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
c800: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
c810: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
c820: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
c830: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
c840: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
c850: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
c860: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
c870: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
c880: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
c890: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
c8a0: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
c8b0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
c8c0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
c8d0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
c8e0: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
c8f0: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
c900: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
c910: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66  oid *pArg.){.#if
c920: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c930: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
c940: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
c950: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
c960: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
c970: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
c980: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
c990: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
c9a0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
c9b0: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
c9c0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
c9d0: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
c9e0: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
c9f0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73  ogressOps = (uns
ca00: 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20  igned)nOps;.    
ca10: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
ca20: 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65   = pArg;.  }else
ca30: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
ca40: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ess = 0;.    db-
ca50: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
ca60: 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  0;.    db->pProg
ca70: 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d  ressArg = 0;.  }
ca80: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ca90: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
caa0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
cab0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cac0: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
cad0: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
cae0: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
caf0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
cb00: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
cb10: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
cb20: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69  eturning 0..*/.i
cb30: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
cb40: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20  timeout(sqlite3 
cb50: 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69  *db, int ms){.#i
cb60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cb70: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
cb80: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
cb90: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
cba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
cbb0: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
cbc0: 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20  .  if( ms>0 ){. 
cbd0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
cbe0: 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69  handler(db, sqli
cbf0: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
cc00: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62  lback, (void*)db
cc10: 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54  );.    db->busyT
cc20: 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d  imeout = ms;.  }
cc30: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
cc40: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
cc50: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  b, 0, 0);.  }.  
cc60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cc70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  ;.}../*.** Cause
cc80: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65   any pending ope
cc90: 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61  ration to stop a
cca0: 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f  t its earliest o
ccb0: 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76  pportunity..*/.v
ccc0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  oid sqlite3_inte
ccd0: 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64  rrupt(sqlite3 *d
cce0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
ccf0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
cd00: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
cd10: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
cd20: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
cd30: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
cd40: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
cd50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d    }.#endif.  db-
cd60: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
cd70: 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  d = 1;.}.../*.**
cd80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
cd90: 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  s exactly the sa
cda0: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72  me as sqlite3_cr
cdb0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
cdc0: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
cdd0: 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  it is designed t
cde0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69  o be called by i
cdf0: 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68  nternal code. Th
ce00: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a  e difference is.
ce10: 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c  ** that if a mal
ce20: 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73  loc() fails in s
ce30: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
ce40: 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72  nction(), an err
ce50: 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65  or code.** is re
ce60: 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d  turned and the m
ce70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
ce80: 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e   cleared. .*/.in
ce90: 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  t sqlite3CreateF
cea0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  unc(.  sqlite3 *
ceb0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
cec0: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
ced0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
cee0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
cef0: 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69  pUserData,.  voi
cf00: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
cf10: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
cf20: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
cf30: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
cf40: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
cf50: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
cf60: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
cf70: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
cf80: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
cf90: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
cfa0: 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a  *pDestructor.){.
cfb0: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20    FuncDef *p;.  
cfc0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74  int nName;.  int
cfd0: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20   extraFlags;..  
cfe0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cff0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
d000: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a  utex) );.  if( z
d010: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
d020: 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20  ||.      (xFunc 
d030: 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53  && (xFinal || xS
d040: 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  tep)) || .      
d050: 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e  (!xFunc && (xFin
d060: 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c  al && !xStep)) |
d070: 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20  |.      (!xFunc 
d080: 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78  && (!xFinal && x
d090: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
d0a0: 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67  (nArg<-1 || nArg
d0b0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  >SQLITE_MAX_FUNC
d0c0: 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20  TION_ARG) ||.   
d0d0: 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d     (255<(nName =
d0e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
d0f0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  ( zFunctionName)
d100: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
d110: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
d120: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  KPT;.  }..  asse
d130: 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
d140: 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45  CONSTANT==SQLITE
d150: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
d160: 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d  ;.  extraFlags =
d170: 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44   enc &  SQLITE_D
d180: 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20  ETERMINISTIC;.  
d190: 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46  enc &= (SQLITE_F
d1a0: 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49  UNC_ENCMASK|SQLI
d1b0: 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e  TE_ANY);.  .#ifn
d1c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d1d0: 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51  UTF16.  /* If SQ
d1e0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
d1f0: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
d200: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
d210: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
d220: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
d230: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
d240: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
d250: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
d260: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
d270: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
d280: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
d290: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a  nternally..  **.
d2a0: 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41    ** If SQLITE_A
d2b0: 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  NY is specified,
d2c0: 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69   add three versi
d2d0: 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ons of the funct
d2e0: 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ion.  ** to the 
d2f0: 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  hash table..  */
d300: 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  .  if( enc==SQLI
d310: 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20  TE_UTF16 ){.    
d320: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
d330: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73  16NATIVE;.  }els
d340: 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54  e if( enc==SQLIT
d350: 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74  E_ANY ){.    int
d360: 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
d370: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
d380: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
d390: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
d3a0: 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c  UTF8|extraFlags,
d3b0: 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44  .         pUserD
d3c0: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
d3d0: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
d3e0: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  ructor);.    if(
d3f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d400: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d410: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
d420: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
d430: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
d440: 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67  TF16LE|extraFlag
d450: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73  s,.          pUs
d460: 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78  erData, xFunc, x
d470: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44  Step, xFinal, pD
d480: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
d490: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
d4a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d4b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d4c0: 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  }.    enc = SQLI
d4d0: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a  TE_UTF16BE;.  }.
d4e0: 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51  #else.  enc = SQ
d4f0: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69  LITE_UTF8;.#endi
d500: 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  f.  .  /* Check 
d510: 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66  if an existing f
d520: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
d530: 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64   overridden or d
d540: 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20  eleted. If so,. 
d550: 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
d560: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68  e active VMs, th
d570: 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
d580: 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63  _BUSY. If a func
d590: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69  tion.  ** is bei
d5a0: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65  ng overridden/de
d5b0: 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20  leted but there 
d5c0: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
d5d0: 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a  s, allow the.  *
d5e0: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63  * operation to c
d5f0: 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61  ontinue but inva
d600: 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f  lidate all preco
d610: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
d620: 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  s..  */.  p = sq
d630: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
d640: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
d650: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
d660: 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20  , (u8)enc, 0);. 
d670: 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75   if( p && (p->fu
d680: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
d690: 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d  _FUNC_ENCMASK)==
d6a0: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
d6b0: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
d6c0: 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
d6d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d6e0: 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
d6f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
d700: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
d710: 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
d720: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75  user-function du
d730: 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
d740: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
d750: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
d760: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
d770: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d780: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
d790: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d7a0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
d7b0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
d7c0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71   }.  }..  p = sq
d7d0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
d7e0: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
d7f0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
d800: 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20  , (u8)enc, 1);. 
d810: 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d   assert(p || db-
d820: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a  >mallocFailed);.
d830: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
d840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d850: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
d860: 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69  f an older versi
d870: 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  on of the functi
d880: 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67  on with a config
d890: 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20  ured destructor 
d8a0: 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  is.  ** being re
d8b0: 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68  placed invoke th
d8c0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e  e destructor fun
d8d0: 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20  ction here. */. 
d8e0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
d8f0: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20  (db, p);..  if( 
d900: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
d910: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
d920: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d  nRef++;.  }.  p-
d930: 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  >pDestructor = p
d940: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d  Destructor;.  p-
d950: 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d  >funcFlags = (p-
d960: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
d970: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
d980: 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a  ) | extraFlags;.
d990: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
d9a0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
d9b0: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
d9c0: 29 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20  );.  p->xFunc = 
d9d0: 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65  xFunc;.  p->xSte
d9e0: 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  p = xStep;.  p->
d9f0: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
da00: 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  al;.  p->pUserDa
da10: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
da20: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
da30: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
da40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
da50: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
da60: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ser functions..*
da70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
da80: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
da90: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
daa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
dab0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
dac0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
dad0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
dae0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
daf0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
db00: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
db10: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
db20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
db30: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
db40: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
db50: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
db60: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74  ntext*).){.  ret
db70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61  urn sqlite3_crea
db80: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64  te_function_v2(d
db90: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
dba0: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
dbb0: 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Step,.          
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 78 46 69 6e 61 6c            xFinal
dbe0: 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  , 0);.}..int sql
dbf0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
dc00: 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
dc10: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
dc20: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
dc30: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
dc40: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
dc50: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
dc60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
dc70: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
dc80: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
dc90: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
dca0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
dcb0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
dcc0: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
dcd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
dce0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  ),.  void (*xDes
dcf0: 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b  troy)(void *).){
dd00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
dd10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63  TE_ERROR;.  Func
dd20: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67  Destructor *pArg
dd30: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
dd40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
dd50: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
dd60: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
dd70: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
dd80: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
dd90: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
dda0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
ddb0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ddc0: 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74  ex);.  if( xDest
ddd0: 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20  roy ){.    pArg 
dde0: 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  = (FuncDestructo
ddf0: 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  r *)sqlite3DbMal
de00: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
de10: 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  of(FuncDestructo
de20: 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41  r));.    if( !pA
de30: 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73  rg ){.      xDes
de40: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
de50: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
de60: 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f     pArg->xDestro
de70: 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20  y = xDestroy;.  
de80: 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74    pArg->pUserDat
de90: 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20  a = p;.  }.  rc 
dea0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
deb0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  unc(db, zFunc, n
dec0: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75  Arg, enc, p, xFu
ded0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
dee0: 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20  l, pArg);.  if( 
def0: 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52  pArg && pArg->nR
df00: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ef==0 ){.    ass
df10: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
df20: 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72  OK );.    xDestr
df30: 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  oy(p);.    sqlit
df40: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 72  e3DbFree(db, pAr
df50: 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20  g);.  }.. out:. 
df60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
df70: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
df80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
df90: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
dfa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dfb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dfc0: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
dfd0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
dfe0: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
dff0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
e000: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
e010: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
e020: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
e030: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
e040: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
e050: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e060: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
e070: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
e080: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
e090: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e0a0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
e0b0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e0c0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
e0d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
e0e0: 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65   *zFunc8;..#ifde
e0f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e100: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
e110: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
e120: 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75  eckOk(db) || zFu
e130: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20  nctionName==0 ) 
e140: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e150: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
e160: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
e170: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
e180: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
e190: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e1a0: 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71  );.  zFunc8 = sq
e1b0: 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
e1c0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
e1d0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
e1e0: 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d  6NATIVE);.  rc =
e1f0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
e200: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e  nc(db, zFunc8, n
e210: 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70  Arg, eTextRep, p
e220: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
e230: 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c  xFinal,0);.  sql
e240: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e250: 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73  Func8);.  rc = s
e260: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
e270: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
e280: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
e290: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
e2a0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
e2b0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
e2c0: 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68  hat a function h
e2d0: 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64  as been overload
e2e0: 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20  ed by a virtual 
e2f0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
e300: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72  the function alr
e310: 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61  eady exists as a
e320: 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20   regular global 
e330: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a  function, then.*
e340: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
e350: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74  s a no-op.  If t
e360: 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
e370: 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
e380: 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77   create.** a new
e390: 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73   one that always
e3a0: 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69   throws a run-ti
e3b0: 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a  me error.  .**.*
e3c0: 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74  * When virtual t
e3d0: 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20  ables intend to 
e3e0: 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c  provide an overl
e3f0: 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20  oaded function, 
e400: 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63  they.** should c
e410: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
e420: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
e430: 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  e global functio
e440: 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67  n exists..** A g
e450: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d  lobal function m
e460: 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64  ust exist in ord
e470: 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f  er for name reso
e480: 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a  lution to work.*
e490: 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69  * properly..*/.i
e4a0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c  nt sqlite3_overl
e4b0: 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  oad_function(.  
e4c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
e4d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
e4e0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a  ,.  int nArg.){.
e4f0: 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71    int nName = sq
e500: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
e510: 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ame);.  int rc =
e520: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
e530: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e540: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
e550: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
e560: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
e570: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c  Name==0 || nArg<
e580: 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  -2 ){.    return
e590: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
e5a0: 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
e5b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e5c0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
e5d0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
e5e0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
e5f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  zName, nName, nA
e600: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
e610: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   0)==0 ){.    rc
e620: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
e630: 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  Func(db, zName, 
e640: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
e650: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
e670: 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46   sqlite3InvalidF
e680: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  unction, 0, 0, 0
e690: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
e6a0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
e6b0: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
e6c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e6d0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e6e0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
e6f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
e700: 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  E./*.** Register
e710: 20 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f   a trace functio
e720: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
e730: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
e740: 20 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63   registered trac
e750: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
e760: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
e770: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20   trace function 
e780: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72  means that no tr
e790: 61 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  acing is execute
e7a0: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
e7b0: 2a 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69  * trace is a poi
e7c0: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
e7d0: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
e7e0: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
e7f0: 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73  of each.** SQL s
e800: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
e810: 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65  d *sqlite3_trace
e820: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
e830: 69 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69  id (*xTrace)(voi
e840: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c  d*,const char*),
e850: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
e860: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66  void *pOld;..#if
e870: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e880: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
e890: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
e8a0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
e8b0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
e8c0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
e8d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
e8e0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e8f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e900: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
e910: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a   db->pTraceArg;.
e920: 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78    db->xTrace = x
e930: 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
e940: 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = pArg;. 
e950: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
e960: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
e970: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
e980: 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  }./*.** Register
e990: 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74   a profile funct
e9a0: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
e9b0: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
e9c0: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a  ly registered .*
e9d0: 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  * profile functi
e9e0: 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  on is returned. 
e9f0: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70   .**.** A NULL p
ea00: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
ea10: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72  means that no pr
ea20: 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75  ofiling is execu
ea30: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
ea40: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61  .** profile is a
ea50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
ea60: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
ea70: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
ea80: 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65  nclusion of.** e
ea90: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
eaa0: 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a  t that is run..*
eab0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
eac0: 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74  profile(.  sqlit
ead0: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28  e3 *db,.  void (
eae0: 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a  *xProfile)(void*
eaf0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
eb00: 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76  ite_uint64),.  v
eb10: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76  oid *pArg.){.  v
eb20: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64  oid *pOld;..#ifd
eb30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
eb40: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
eb50: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
eb60: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
eb70: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
eb80: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
eb90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
eba0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ebb0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ebc0: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
ebd0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b  db->pProfileArg;
ebe0: 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20  .  db->xProfile 
ebf0: 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62  = xProfile;.  db
ec00: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20  ->pProfileArg = 
ec10: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
ec20: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
ec30: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
ec40: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
ec50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
ec60: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
ec70: 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69  egister a functi
ec80: 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
ec90: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
eca0: 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20  ion commits..** 
ecb0: 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66  If the invoked f
ecc0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
ecd0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
ece0: 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65  he commit become
ecf0: 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e  s a.** rollback.
ed00: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
ed10: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20  3_commit_hook(. 
ed20: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
ed30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
ed40: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
ed50: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
ed60: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
ed70: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a  ack)(void*),  /*
ed80: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   Function to inv
ed90: 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d  oke on each comm
eda0: 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  it */.  void *pA
edb0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
edc0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
edd0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
ede0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
edf0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ee00: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
ee10: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
ee20: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
ee30: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
ee40: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
ee50: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
ee60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
ee70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ee80: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
ee90: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
eea0: 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
eeb0: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
eec0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
eed0: 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
eee0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
eef0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
ef00: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
ef10: 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
ef20: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
ef30: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
ef40: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
ef50: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
ef60: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
ef70: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
ef80: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ef90: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
efa0: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
efb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
efd0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
efe0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
eff0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
f000: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
f010: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
f020: 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
f030: 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
f040: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
f050: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
f060: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
f070: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
f080: 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  pRet;..#ifdef SQ
f090: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
f0a0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
f0b0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
f0c0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
f0d0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
f0e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
f0f0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
f100: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f110: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
f120: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
f130: 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
f140: 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
f150: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
f160: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d  db->pUpdateArg =
f170: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
f180: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f190: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f1a0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
f1b0: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
f1c0: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
f1d0: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
f1e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
f1f0: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20  lled.** back by 
f200: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
f210: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
f220: 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  d *sqlite3_rollb
f230: 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ack_hook(.  sqli
f240: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
f250: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
f260: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
f270: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
f280: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
f290: 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c  (void*), /* Call
f2a0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
f2b0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2d0: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
f2e0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
f2f0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
f300: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f310: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
f320: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f330: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
f340: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
f350: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f360: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f370: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f380: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f390: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
f3a0: 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  = db->pRollbackA
f3b0: 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  rg;.  db->xRollb
f3c0: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ackCallback = xC
f3d0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
f3e0: 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41  RollbackArg = pA
f3f0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
f400: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f410: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
f420: 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
f430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
f440: 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
f450: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
f460: 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
f470: 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   by sqlite3_wal_
f480: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
f490: 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ..** Invoke sqli
f4a0: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
f4b0: 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72  nt if the number
f4c0: 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
f4d0: 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73  e log file.** is
f4e0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71   greater than sq
f4f0: 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61  lite3.pWalArg ca
f500: 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
f510: 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66   (the value conf
f520: 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c  igured by.** wal
f530: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
f540: 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ))..*/ .int sqli
f550: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
f560: 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  k(.  void *pClie
f570: 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41  ntData,     /* A
f580: 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  rgument */.  sql
f590: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
f5a0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
f5b0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
f5c0: 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a  r *zDb,       /*
f5d0: 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   Database */.  i
f5e0: 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20  nt nFrame       
f5f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f600: 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   WAL */.){.  if(
f610: 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f   nFrame>=SQLITE_
f620: 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65  PTR_TO_INT(pClie
f630: 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73  ntData) ){.    s
f640: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
f650: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
f660: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
f670: 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a  point(db, zDb);.
f680: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
f690: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
f6a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
f6b0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
f6c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
f6d0: 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  L */../*.** Conf
f6e0: 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33  igure an sqlite3
f6f0: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
f700: 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69  back to automati
f710: 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
f720: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
f730: 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fter committing 
f740: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  a transaction if
f750: 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d   there are nFram
f760: 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61  e or.** more fra
f770: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
f780: 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72  ile. Passing zer
f790: 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20  o or a negative 
f7a0: 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20  value as the.** 
f7b0: 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72  nFrame parameter
f7c0: 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61   disables automa
f7d0: 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  tic checkpoints 
f7e0: 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  entirely..**.** 
f7f0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  The callback reg
f800: 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20  istered by this 
f810: 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65  function replace
f820: 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63  s any existing c
f830: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73  allback.** regis
f840: 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69  tered using sqli
f850: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20  te3_wal_hook(). 
f860: 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74  Likewise, regist
f870: 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b  ering a callback
f880: 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
f890: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73  3_wal_hook() dis
f8a0: 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61  ables the automa
f8b0: 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d  tic checkpoint m
f8c0: 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66  echanism.** conf
f8d0: 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66  igured by this f
f8e0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
f8f0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
f900: 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
f910: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61  e3 *db, int nFra
f920: 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  me){.#ifdef SQLI
f930: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e  TE_OMIT_WAL.  UN
f940: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
f950: 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  b);.  UNUSED_PAR
f960: 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a  AMETER(nFrame);.
f970: 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c  #else.#ifdef SQL
f980: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f990: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f9a0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f9b0: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
f9c0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f9d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  ;.#endif.  if( n
f9e0: 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73  Frame>0 ){.    s
f9f0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
fa00: 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65  db, sqlite3WalDe
fa10: 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54  faultHook, SQLIT
fa20: 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72  E_INT_TO_PTR(nFr
fa30: 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ame));.  }else{.
fa40: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
fa50: 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a  hook(db, 0, 0);.
fa60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
fa70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fa80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
fa90: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
faa0: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
fab0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
fac0: 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  n is written.** 
fad0: 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61  into the write-a
fae0: 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73  head-log by this
faf0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
fb00: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
fb10: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
fb20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
fb50: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62   hook to this db
fb60: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
fb70: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
fb80: 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  d *, sqlite3*, c
fb90: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
fba0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
fbd0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
fbe0: 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29  xCallback() */.)
fbf0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
fc00: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64  _OMIT_WAL.  void
fc10: 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53   *pRet;.#ifdef S
fc20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
fc30: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
fc40: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
fc50: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
fc60: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
fc70: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
fc80: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
fc90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fca0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
fcb0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
fcc0: 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78  pWalArg;.  db->x
fcd0: 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  WalCallback = xC
fce0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
fcf0: 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  WalArg = pArg;. 
fd00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
fd10: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
fd20: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
fd30: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
fd40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
fd50: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
fd60: 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e  abase zDb..*/.in
fd70: 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
fd80: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73  eckpoint_v2(.  s
fd90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fdb0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
fdc0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
fdd0: 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
fde0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
fdf0: 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
fe00: 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ase (or NULL) */
fe10: 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20  .  int eMode,   
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45     /* SQLITE_CHE
fe40: 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20  CKPOINT_* value 
fe50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  */.  int *pnLog,
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
fe80: 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20  e of WAL log in 
fe90: 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20  frames */.  int 
fea0: 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20  *pnCkpt         
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fec0: 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
fed0: 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b   of frames check
fee0: 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69  pointed */.){.#i
fef0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
ff00: 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51  _WAL.  return SQ
ff10: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
ff20: 20 69 6e 74 20 72 63 3b 20 20 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 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
ff50: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53  */.  int iDb = S
ff60: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
ff70: 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e  ED;  /* sqlite3.
ff80: 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64  aDb[] index of d
ff90: 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  b to checkpoint 
ffa0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
ffb0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
ffc0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
ffd0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
ffe0: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
fff0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10000 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69  #endif..  /* Ini
10010 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
10020 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
10030 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  -1 in case an er
10040 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
10050 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e   if( pnLog ) *pn
10060 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Log = -1;.  if( 
10070 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74  pnCkpt ) *pnCkpt
10080 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74   = -1;..  assert
10090 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
100a0 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29  INT_PASSIVE==0 )
100b0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
100c0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
100d0 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  LL==1 );.  asser
100e0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
100f0 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20  OINT_RESTART==2 
10100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
10110 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
10120 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20  RUNCATE==3 );.  
10130 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
10140 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
10150 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
10160 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54  ITE_CHECKPOINT_T
10170 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f  RUNCATE ){.    /
10180 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10190 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65  -03996-12088 The
101a0 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73   M parameter mus
101b0 74 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65  t be a valid che
101c0 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d  ckpoint.    ** m
101d0 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75  ode: */.    retu
101e0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
101f0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
10200 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10210 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
10220 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
10230 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
10240 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
10250 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
10260 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
10270 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
10280 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10290 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
102a0 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
102b0 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
102c0 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
102d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
102e0 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
102f0 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
10300 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
10310 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
10320 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   rc);.  }.  rc =
10330 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
10340 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
10350 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10360 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10370 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
10380 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  .../*.** Checkpo
10390 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
103a0 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c  . If zDb is NULL
103b0 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66  , or if the buff
103c0 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a  er zDb points.**
103d0 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a   to contains a z
103e0 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e  ero-length strin
103f0 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  g, all attached 
10400 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a  databases are .*
10410 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  * checkpointed..
10420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
10430 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  al_checkpoint(sq
10440 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
10450 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f   char *zDb){.  /
10460 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10470 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54 68 65  -41613-20553 The
10480 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
10490 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69 73 20  ckpoint(D,X) is 
104a0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
104b0 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ** sqlite3_wal_c
104c0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58  heckpoint_v2(D,X
104d0 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  ,SQLITE_CHECKPOI
104e0 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 2e  NT_PASSIVE,0,0).
104f0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
10500 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10510 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51  int_v2(db,zDb,SQ
10520 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
10530 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a  PASSIVE,0,0);.}.
10540 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10550 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52  OMIT_WAL./*.** R
10560 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
10570 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
10580 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
10590 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
105a0 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
105b0 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
105c0 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
105d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
105e0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
105f0 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63  abase being chec
10600 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a  kpointed, this .
10610 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
10620 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
10630 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69  D and a checkpoi
10640 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  nt is not attemp
10650 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ted. If .** an e
10660 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
10670 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68  e running the ch
10680 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c  eckpoint, an SQL
10690 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
106a0 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28  s .** returned (
106b0 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
106c0 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  R). Otherwise, S
106d0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
106e0 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  The mutex on dat
106f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20  abase handle db 
10700 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62  should be held b
10710 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
10720 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63  e mutex.** assoc
10730 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
10740 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62  pecific b-tree b
10750 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
10760 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a  d is taken by.**
10770 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
10780 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f  hile the checkpo
10790 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  int is running..
107a0 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20  **.** If iDb is 
107b0 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41  passed SQLITE_MA
107c0 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e  X_ATTACHED, then
107d0 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
107e0 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63  tabases are.** c
107f0 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20  heckpointed. If 
10800 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
10810 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65  untered it is re
10820 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
10830 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d  ly -.** no attem
10840 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
10850 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d  eckpoint any rem
10860 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73  aining databases
10870 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
10880 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f  r eMode is one o
10890 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
108a0 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
108b0 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f  L or RESTART..*/
108c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
108d0 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
108e0 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
108f0 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
10900 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
10910 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10920 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
10930 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10940 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
10950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10960 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
10970 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
10980 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
10990 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
109a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
109b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
109c0 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
109d0 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
109e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
109f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10a00 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
10a10 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
10a20 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
10a30 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
10a40 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
10a50 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
10a60 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
10a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
10a80 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
10a90 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
10aa0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
10ab0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10ac0 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
10ad0 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
10ae0 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
10af0 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
10b00 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
10b10 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
10b20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10b30 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
10b40 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
10b50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10b60 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
10b70 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
10b80 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
10b90 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
10ba0 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
10bb0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10bc0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
10bd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
10be0 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
10bf0 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
10c00 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
10c10 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
10c20 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
10c30 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
10c40 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
10c50 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
10c60 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
10c70 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
10c80 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
10c90 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
10ca0 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
10cb0 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
10cc0 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
10cd0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
10ce0 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
10cf0 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
10d00 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
10d10 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
10d20 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
10d30 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
10d40 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
10d50 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
10d60 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
10d70 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
10d80 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
10d90 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
10da0 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
10dd0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
10de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10df0 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
10e00 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
10e20 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
10e30 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
10e70 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e90 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
10ea0 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
10eb0 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
10ee0 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
10ef0 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
10f00 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
10f10 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
10f20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
10f30 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
10f40 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
10f50 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
10f70 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
10f80 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
10fc0 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
10ff0 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
11000 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
11010 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
11020 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
11030 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
11040 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
11050 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
11060 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
11070 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
11080 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
11090 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
110a0 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
110b0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
110c0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
110d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
110e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
110f0 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
11100 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
11110 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  3.  return 0;.#e
11120 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
11130 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
11140 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
11150 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
11160 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
11170 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
11180 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
11190 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
111a0 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
111b0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
111c0 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
111d0 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
111e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
111f0 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
11200 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
11210 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
11220 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
11230 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
11240 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  SE_BKPT);.  }.  
11250 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
11260 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
11270 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11280 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
11290 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
112a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
112b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74   }else{.    test
112c0 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d  case( db->pErr==
112d0 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  0 );.    z = (ch
112e0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
112f0 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
11300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
11310 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11320 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
11330 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
11340 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
11350 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
11360 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
11370 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11380 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
11390 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
113a0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
113b0 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
113c0 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
113d0 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
113e0 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
113f0 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
11400 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
11410 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
11420 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
11430 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
11440 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
11450 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
11460 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
11470 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
11480 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
11490 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
114a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
114b0 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
114c0 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62      'l', 'i', 'b
114d0 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27  ', 'r', 'a', 'r'
114e0 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'y', ' ', .   
114f0 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20   'r', 'o', 'u', 
11500 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27  't', 'i', 'n', '
11510 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63  e', ' ', .    'c
11520 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27  ', 'a', 'l', 'l'
11530 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'e', 'd', ' ',
11540 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20   .    'o', 'u', 
11550 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  't', ' ', .    '
11560 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20  o', 'f', ' ', . 
11570 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27     's', 'e', 'q'
11580 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c  , 'u', 'e', 'n',
11590 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   'c', 'e', 0.  }
115a0 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
115b0 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
115c0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
115d0 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
115e0 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
115f0 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
11600 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
11610 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
11620 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
11630 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11640 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
11650 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
11660 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
11670 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
11680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
11690 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
116a0 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
116b0 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
116c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
116d0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64  rorWithMsg(db, d
116e0 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69  b->errCode, sqli
116f0 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
11700 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a  rCode));.      z
11710 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
11720 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
11730 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
11740 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68  A malloc() may h
11750 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69  ave failed withi
11760 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  n the call to sq
11770 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
11780 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  16().    ** abov
11790 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
117a0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
117b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
117c0 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a  d flag needs to.
117d0 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65      ** be cleare
117e0 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
117f0 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
11800 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
11810 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69   via.    ** sqli
11820 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f  te3ApiExit(), to
11830 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74   avoid setting t
11840 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
11850 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
11860 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d  ..    */.    db-
11870 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
11880 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
11890 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
118a0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
118b0 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
118c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
118d0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  16 */../*.** Ret
118e0 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
118f0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67  ent error code g
11900 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53  enerated by an S
11910 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49  QLite routine. I
11920 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73  f NULL is.** pas
11930 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
11940 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20  tion, we assume 
11950 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  a malloc() faile
11960 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  d during sqlite3
11970 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _open()..*/.int 
11980 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
11990 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
119a0 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
119b0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
119c0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
119d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
119e0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
119f0 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
11a00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11a10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11a20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
11a30 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
11a40 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  de & db->errMask
11a50 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
11a60 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
11a70 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
11a80 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
11a90 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
11aa0 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
11ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ac0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
11ad0 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
11ae0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11af0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11b00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
11b10 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
11b20 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ode;.}../*.** Re
11b30 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
11b40 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
11b50 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
11b60 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
11b70 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f  ** argument.  Fo
11b80 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70  r now, this simp
11b90 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74  ly calls the int
11ba0 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72  ernal sqlite3Err
11bb0 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  Str().** functio
11bc0 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
11bd0 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72   *sqlite3_errstr
11be0 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75  (int rc){.  retu
11bf0 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
11c00 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  (rc);.}../*.** C
11c10 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c  reate a new coll
11c20 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66  ating function f
11c30 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22  or database "db"
11c40 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a  .  The name is z
11c50 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Name.** and the 
11c60 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e  encoding is enc.
11c70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
11c80 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a  reateCollation(.
11c90 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20    sqlite3* db,. 
11ca0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11cb0 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20  me, .  u8 enc,. 
11cc0 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
11cd0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
11ce0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
11cf0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
11d00 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
11d10 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
11d20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
11d30 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20    int enc2;.  . 
11d40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11d50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
11d60 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
11d70 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
11d80 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
11d90 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
11da0 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
11db0 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
11dc0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
11dd0 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
11de0 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
11df0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
11e00 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
11e10 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
11e20 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
11e30 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
11e40 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
11e50 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
11e60 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
11e70 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
11e80 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
11e90 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
11ea0 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
11eb0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
11ec0 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
11ed0 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
11ee0 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
11ef0 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
11f00 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
11f10 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
11f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
11f30 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
11f40 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
11f50 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
11f60 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
11f70 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
11f80 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
11f90 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
11fa0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
11fb0 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
11fc0 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
11fd0 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
11fe0 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
11ff0 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
12000 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
12010 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   */.  pColl = sq
12020 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
12030 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
12040 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
12050 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
12060 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
12070 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
12080 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12090 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
120a0 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
120b0 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
120c0 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
120d0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
120e0 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
120f0 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
12100 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12110 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
12120 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
12130 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
12140 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  ts(db);..    /* 
12150 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  If collation seq
12160 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20  uence pColl was 
12170 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79  created directly
12180 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20   by a call to.  
12190 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65    ** sqlite3_cre
121a0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61  ate_collation, a
121b0 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64  nd not generated
121c0 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
121d0 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  (),.    ** then 
121e0 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20  any copies made 
121f0 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
12200 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76  ) need to be inv
12210 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a  alidated..    **
12220 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e   Also, collation
12230 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f   destructor - Co
12240 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66  llSeq.xDel() - f
12250 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64  unction may need
12260 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61  .    ** to be ca
12270 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  lled..    */ .  
12280 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e    if( (pColl->en
12290 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31  c & ~SQLITE_UTF1
122a0 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32  6_ALIGNED)==enc2
122b0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
122c0 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *aColl = sqlit
122d0 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
122e0 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29  aCollSeq, zName)
122f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
12300 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
12310 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  3; j++){.       
12320 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61   CollSeq *p = &a
12330 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
12340 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f   if( p->enc==pCo
12350 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20  ll->enc ){.     
12360 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c       if( p->xDel
12370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12380 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72  p->xDel(p->pUser
12390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
123a0 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70           p->xCmp
123b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
123c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
123d0 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  }..  pColl = sql
123e0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
123f0 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
12400 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ame, 1);.  if( p
12410 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Coll==0 ) return
12420 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12430 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78   pColl->xCmp = x
12440 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c  Compare;.  pColl
12450 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a  ->pUser = pCtx;.
12460 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20    pColl->xDel = 
12470 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65  xDel;.  pColl->e
12480 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c  nc = (u8)(enc2 |
12490 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55   (enc & SQLITE_U
124a0 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a  TF16_ALIGNED));.
124b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
124c0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
124d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
124e0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
124f0 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
12500 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
12510 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
12520 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
12530 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
12540 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
12550 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
12560 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
12570 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
12580 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
12590 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
125a0 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
125b0 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
125c0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
125d0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
125e0 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
125f0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
12600 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
12610 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
12620 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
12630 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
12640 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
12650 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
12660 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
12670 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
12680 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
12690 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
126a0 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50  BER,      /* IMP
126b0 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32 20  : R-38091-32352 
126c0 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  */.  SQLITE_MAX_
126d0 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 20  TRIGGER_DEPTH,. 
126e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
126f0 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a  ER_THREADS,.};..
12700 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
12710 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
12720 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
12730 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
12740 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
12750 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
12760 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
12770 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
12780 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
12790 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
127a0 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
127b0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
127c0 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
127d0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
127e0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
127f0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
12800 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
12810 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
12820 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
12830 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
12840 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
12850 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
12860 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
12870 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
12880 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
12890 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
128a0 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
128b0 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
128c0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
128d0 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
128e0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
128f0 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
12900 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
12910 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
12920 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
12930 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
12940 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a  NCTION_ARG>1000.
12950 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
12960 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
12970 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
12980 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69  0 and 1000.#endi
12990 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
129a0 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
129b0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
129c0 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53  ED>125.# error S
129d0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
129e0 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
129f0 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e  en 0 and 125.#en
12a00 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
12a10 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
12a20 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
12a30 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
12a40 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
12a50 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
12a60 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
12a70 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
12a80 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
12a90 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
12aa0 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
12ab0 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
12ac0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
12ad0 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
12ae0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
12af0 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
12b00 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
12b10 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
12b20 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
12b30 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45  EADS<0 || SQLITE
12b40 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
12b50 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53  ADS>50.# error S
12b60 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
12b70 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65  _THREADS must be
12b80 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35   between 0 and 5
12b90 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
12ba0 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
12bb0 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
12bc0 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
12bd0 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
12be0 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
12bf0 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
12c00 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
12c10 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
12c20 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
12c30 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
12c40 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
12c50 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
12c60 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
12c70 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
12c80 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
12c90 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
12ca0 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
12cb0 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
12cc0 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
12cd0 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
12ce0 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
12cf0 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
12d00 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
12d10 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
12d20 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
12d30 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  it;..#ifdef SQLI
12d40 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
12d50 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
12d60 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
12d70 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
12d80 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
12d90 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
12da0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
12db0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
12dc0 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
12dd0 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
12de0 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
12df0 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
12e00 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
12e10 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
12e20 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
12e30 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
12e40 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
12e50 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
12e60 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
12e70 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
12e80 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
12e90 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
12ea0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
12eb0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
12ec0 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
12ed0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
12ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
12ef0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
12f00 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
12f10 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
12f20 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
12f30 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
12f40 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
12f50 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
12f60 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
12f70 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
12f80 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
12f90 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
12fa0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
12fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
12fc0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
12fd0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
12fe0 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
12ff0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
13000 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
13010 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13020 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
13030 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
13040 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
13050 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13060 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
13070 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
13080 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
13090 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
130a0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
130b0 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
130c0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
130d0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
130e0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
130f0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
13100 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
13140 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
13150 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
13160 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
13170 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
13180 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
13190 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
131a0 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
131b0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
131c0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
131d0 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
131e0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
131f0 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
13200 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13210 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13220 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
13230 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
13240 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
13250 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
13260 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
13270 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
13280 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
13290 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
132a0 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
132b0 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
132c0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
132d0 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
132e0 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
132f0 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
13300 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
13310 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
13320 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
13330 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
13340 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
13350 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
13360 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
13370 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
13380 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
13390 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
133a0 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
133b0 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
133c0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
133d0 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
133f0 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
13400 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
13410 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13420 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
13430 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
13440 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
13450 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
13460 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
13470 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
13480 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
13490 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
134a0 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
134b0 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
134c0 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
134d0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
134e0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
134f0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
13500 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
13510 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
13520 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
13530 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
13540 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
13550 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
13560 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
13570 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
13580 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
13590 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
135a0 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
135b0 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
135c0 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
135d0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
135e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
135f0 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
13600 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
13610 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
13620 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
13630 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
13640 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
13650 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
13660 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
13670 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
13680 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
13690 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
136a0 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
136b0 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
136c0 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
136d0 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
136e0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
136f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
13700 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
13710 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
13720 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
13730 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
13740 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
13750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
13760 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
13770 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
13780 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
13790 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
137a0 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
137b0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
137c0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
137d0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
137e0 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
137f0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
13800 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
13810 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
13820 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13830 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
13840 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
13850 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
13860 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
13870 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
13880 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
13890 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
138a0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
138b0 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
138c0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
138d0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
138e0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
138f0 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
13900 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
13910 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
13920 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
13930 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
13940 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
13950 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
13960 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
13970 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
13980 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
13990 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
139b0 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
139c0 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
139d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
139e0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
139f0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
13a00 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
13a10 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
13a20 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
13a30 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
13a40 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
13a50 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
13a80 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
13a90 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
13aa0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
13ab0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
13ac0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
13ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
13ae0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
13b00 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
13b10 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
13b20 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
13b30 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
13b40 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
13b50 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
13b60 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
13b70 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
13b80 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
13b90 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
13ba0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13bb0 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20  EN_URI)         
13bc0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38      /* IMP: R-48
13bd0 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20  725-32206 */.   
13be0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
13bf0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13c00 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50  bOpenUri) /* IMP
13c10 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20  : R-51689-46548 
13c20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  */.   && nUri>=5
13c30 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
13c40 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
13c50 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d  /* IMP: R-57884-
13c60 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20  37496 */.  ){.  
13c70 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
13c80 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
13cb0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
13cc0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
13cf0 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
13d00 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
13d10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13d20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
13d30 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
13d40 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
13d50 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
13d60 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
13d70 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
13d80 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
13d90 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
13da0 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
13db0 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
13dc0 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
13dd0 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
13de0 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
13df0 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
13e00 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
13e10 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
13e20 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
13e30 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
13e40 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
13e50 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
13e60 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
13e70 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
13e80 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
13e90 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
13ea0 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
13eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13ec0 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20  MEM;..    iIn = 
13ed0 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  5;.#ifndef SQLIT
13ee0 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
13ef0 4f 52 49 54 59 0a 20 20 20 20 2f 2a 20 44 69 73  ORITY.    /* Dis
13f00 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
13f10 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
13f20 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
13f30 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
13f40 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
13f50 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
13f60 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
13f70 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
13f80 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
13f90 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
13fa0 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
13fb0 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
13fc0 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
13fd0 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
13fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
13ff0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
14000 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
14010 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
14020 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
14030 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
14040 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
14050 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
14060 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
14070 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
14080 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
14090 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
140a0 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
140b0 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
140c0 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
140d0 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
140e0 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
140f0 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
14100 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
14110 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
14120 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
14130 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
14140 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
14150 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
14160 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
14170 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
14180 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
14190 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
141a0 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
141b0 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
141c0 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
141d0 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
141e0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
141f0 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
14200 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
14210 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
14220 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
14230 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
14240 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
14250 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
14260 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
14270 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
14280 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
14290 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
142a0 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
142b0 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
142c0 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
142d0 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
142e0 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
142f0 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
14300 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
14310 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
14320 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
14330 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
14340 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
14350 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
14360 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
14370 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
14380 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
14390 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
143a0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
143b0 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25  is taken when "%
143c0 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68  00" appears with
143d0 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74  in the URI. In t
143e0 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
143f0 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20   case we ignore 
14400 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20  all text in the 
14410 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
14420 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20   path, name or. 
14430 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
14440 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
14450 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e  g parsed. So ign
14460 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
14470 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20  character.      
14480 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20      ** and skip 
14490 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c  to the next "?",
144a0 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20   "=" or "&", as 
144b0 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a  appropriate. */.
144c0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
144d0 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
144e0 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20  !=0 && c!='#' . 
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
14500 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21  (eState!=0 || c!
14510 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='?').          
14520 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
14530 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20  1 || (c!='=' && 
14540 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20  c!='&')).       
14550 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
14560 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a  e!=2 || c!='&').
14570 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
14580 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a           iIn++;.
14590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
145a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
145b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
145c0 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20    c = octet;.   
145d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
145e0 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26  ate==1 && (c=='&
145f0 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a  ' || c=='=') ){.
14600 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
14610 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a  e[iOut-1]==0 ){.
14620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
14630 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d  empty option nam
14640 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f  e. Ignore this o
14650 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72  ption altogether
14660 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
14670 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
14680 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23  && zUri[iIn]!='#
14690 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d  ' && zUri[iIn-1]
146a0 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='&' ) iIn++;. 
146b0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
146c0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
146d0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20       if( c=='&' 
146e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69  ){.          zFi
146f0 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
14700 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ';.        }else
14710 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
14720 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
14730 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  }.        c = 0;
14740 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
14750 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63   (eState==0 && c
14760 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74  =='?') || (eStat
14770 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20  e==2 && c=='&') 
14780 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30  ){.        c = 0
14790 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  ;.        eState
147a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
147b0 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
147c0 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = c;.    }.   
147d0 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29   if( eState==1 )
147e0 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
147f0 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
14800 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
14810 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
14820 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  +] = '\0';..    
14830 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72  /* Check if ther
14840 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f  e were any optio
14850 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61  ns specified tha
14860 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65  t should be inte
14870 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20  rpreted .    ** 
14880 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68  here. Options th
14890 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74  at are interpret
148a0 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20  ed here include 
148b0 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20  "vfs" and those 
148c0 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72  that.    ** corr
148d0 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20  espond to flags 
148e0 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73  that may be pass
148f0 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
14900 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20  3_open_v2().    
14910 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20  ** method. */.  
14920 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b    zOpt = &zFile[
14930 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14940 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77  zFile)+1];.    w
14950 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b  hile( zOpt[0] ){
14960 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20  .      int nOpt 
14970 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
14980 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63  0(zOpt);.      c
14990 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70  har *zVal = &zOp
149a0 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20  t[nOpt+1];.     
149b0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
149c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c  te3Strlen30(zVal
149d0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  );..      if( nO
149e0 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28  pt==3 && memcmp(
149f0 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d  "vfs", zOpt, 3)=
14a00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56  =0 ){.        zV
14a10 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20  fs = zVal;.     
14a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14a30 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
14a40 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
14a50 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
14a60 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20       int mode;. 
14a70 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20         } *aMode 
14a80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
14a90 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30  r *zModeType = 0
14aa0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61  ;.        int ma
14ab0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
14ac0 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a  int limit = 0;..
14ad0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
14ae0 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63  ==5 && memcmp("c
14af0 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d  ache", zOpt, 5)=
14b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14b10 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
14b20 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64  enMode aCacheMod
14b30 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
14b40 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20      { "shared", 
14b50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
14b60 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
14b70 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61          { "priva
14b80 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  te", SQLITE_OPEN
14b90 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
14ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
14bb0 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
14bc0 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
14bd0 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
14be0 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c  _SHAREDCACHE|SQL
14bf0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
14c00 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20  CACHE;.         
14c10 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d   aMode = aCacheM
14c20 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
14c30 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20  imit = mask;.   
14c40 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
14c50 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20   = "cache";.    
14c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14c70 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d  ( nOpt==4 && mem
14c80 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74  cmp("mode", zOpt
14c90 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
14ca0 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
14cb0 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65  ct OpenMode aOpe
14cc0 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  nMode[] = {.    
14cd0 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20          { "ro", 
14ce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
14cf0 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20  DONLY },.       
14d00 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51       { "rw",  SQ
14d10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
14d20 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20  ITE }, .        
14d30 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c      { "rwc", SQL
14d40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
14d50 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
14d60 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
14d70 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79         { "memory
14d80 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
14d90 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20  EMORY },.       
14da0 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
14db0 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
14dc0 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
14dd0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
14de0 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y | SQLITE_OPEN_
14df0 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20  READWRITE.      
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
14e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
14e20 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
14e30 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20  MEMORY;.        
14e40 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d    aMode = aOpenM
14e50 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
14e60 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c  imit = mask & fl
14e70 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ags;.          z
14e80 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65  ModeType = "acce
14e90 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ss";.        }..
14ea0 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64          if( aMod
14eb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
14ec0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
14ed0 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  int mode = 0;.  
14ee0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
14ef0 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b   aMode[i].z; i++
14f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
14f10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
14f20 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20  Mode[i].z;.     
14f30 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d         if( nVal=
14f40 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
14f50 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  (z) && 0==memcmp
14f60 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20  (zVal, z, nVal) 
14f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14f80 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d   mode = aMode[i]
14f90 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  .mode;.         
14fa0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14fd0 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20  if( mode==0 ){. 
14fe0 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
14ff0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
15000 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
15010 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d  %s mode: %s", zM
15020 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
15030 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
15040 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15050 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
15060 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
15070 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15080 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26       if( (mode &
15090 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45   ~SQLITE_OPEN_ME
150a0 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20  MORY)>limit ){. 
150b0 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
150c0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
150d0 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
150e0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
150f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
15120 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
15130 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15140 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
15150 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
15160 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
15170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15180 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
15190 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
151a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
151b0 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
151c0 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
151d0 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
151e0 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
151f0 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32  e3_malloc(nUri+2
15200 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
15210 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
15220 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
15230 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c  cpy(zFile, zUri,
15240 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c   nUri);.    zFil
15250 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
15260 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
15270 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
15280 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
15290 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
152a0 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
152b0 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
152c0 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
152d0 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
152e0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
152f0 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
15300 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
15310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15320 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
15330 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
15340 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15350 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15360 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
15370 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
15380 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
15390 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
153a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
153b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
153c0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
153d0 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
153e0 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
153f0 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
15400 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
15410 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
15420 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15430 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
15440 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
15450 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
15460 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
15470 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
15480 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
15490 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
154a0 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
154b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
154c0 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
154d0 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
154e0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
154f0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
15500 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
15510 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
15520 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15530 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
15540 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
15550 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
15560 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
15570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15580 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
15590 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
155a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
155d0 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
155e0 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
155f0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
15600 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
15610 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
15620 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
15630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15640 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
15650 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
15660 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
15670 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15690 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
156a0 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
156b0 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ri() */..#ifdef 
156c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
156d0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
156e0 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
156f0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
15700 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
15710 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
15720 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
15730 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
15740 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
15750 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
15760 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
15770 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
15780 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
15790 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
157a0 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
157b0 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
157c0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
157d0 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
157e0 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
157f0 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
15800 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
15810 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
15820 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
15830 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
15840 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
15850 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
15860 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
15870 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
15880 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
15890 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
158a0 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
158b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
158c0 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
158d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
158e0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
158f0 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
15900 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
15910 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
15920 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
15930 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
15940 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
15950 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
15960 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
15970 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
15980 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
15990 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
159a0 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
159b0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
159c0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
159d0 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
159e0 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
159f0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
15a00 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
15a10 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
15a20 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
15a30 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
15a40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
15a50 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
15a60 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20  _BKPT;  /* IMP: 
15a70 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f  R-65497-44594 */
15a80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69  .  }..  if( sqli
15a90 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15aa0 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b  bCoreMutex==0 ){
15ab0 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
15ac0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
15ad0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
15ae0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29  E_OPEN_NOMUTEX )
15af0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
15b00 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
15b10 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
15b20 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
15b30 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
15b40 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  dsafe = 1;.  }el
15b50 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64  se{.    isThread
15b60 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c  safe = sqlite3Gl
15b70 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
15b80 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  Mutex;.  }.  if(
15b90 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
15ba0 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
15bb0 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26  E ){.    flags &
15bc0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  = ~SQLITE_OPEN_S
15bd0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65  HAREDCACHE;.  }e
15be0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
15bf0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
15c00 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
15c10 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
15c20 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
15c30 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f  DCACHE;.  }..  /
15c40 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c  * Remove harmful
15c50 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66   bits from the f
15c60 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20  lags parameter. 
15c70 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
15c80 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
15c90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e   and SQLITE_OPEN
15ca0 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73  _FULLMUTEX flags
15cb0 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74   were.  ** dealt
15cc0 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65   with in the pre
15cd0 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b  vious code block
15ce0 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65  .  Besides these
15cf0 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20  , the only.  ** 
15d00 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67  valid input flag
15d10 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  s for sqlite3_op
15d20 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49  en_v2() are SQLI
15d30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
15d40 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
15d50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51  EN_READWRITE, SQ
15d60 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15d70 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  , SQLITE_OPEN_SH
15d80 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20  AREDCACHE,.  ** 
15d90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
15da0 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f  ATECACHE, and so
15db0 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73  me reserved bits
15dc0 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b  .  Silently mask
15dd0 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74  .  ** off all ot
15de0 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a  her flags..  */.
15df0 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
15e00 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
15e10 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
15e20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
15e30 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
15e40 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
15e50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
15e60 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20  N_DB |.         
15e70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
15e80 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20  N_TEMP_DB | .   
15e90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15ea0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
15eb0 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  T_DB | .        
15ec0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
15ed0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
15ee0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
15ef0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
15f00 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  MP_JOURNAL | .  
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15f20 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
15f30 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
15f40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
15f50 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
15f60 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
15f70 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f    SQLITE_OPEN_NO
15f80 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
15f90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
15fa0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20  EN_FULLMUTEX |. 
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
15fc0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
15fd0 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
15fe0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
15ff0 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
16000 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
16010 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
16020 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
16030 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
16040 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
16050 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
16060 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
16070 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
16080 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
16090 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
160a0 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
160b0 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
160c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
160d0 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
160e0 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
160f0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
16100 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
16110 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
16120 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
16130 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
16140 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
16150 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
16160 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
16170 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
16180 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
16190 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
161a0 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
161b0 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
161c0 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
161d0 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
161e0 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
161f0 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74  ));.  db->aLimit
16200 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  [SQLITE_LIMIT_WO
16210 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20  RKER_THREADS] = 
16220 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
16230 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20  ORKER_THREADS;. 
16240 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
16250 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41  = 1;.  db->nextA
16260 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64  utovac = -1;.  d
16270 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69  b->szMmap = sqli
16280 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16290 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65  szMmap;.  db->ne
162a0 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a  xtPagesize = 0;.
162b0 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
162c0 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46  Mmap = 0x7FFFFFF
162d0 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  F;.  db->flags |
162e0 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
162f0 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
16300 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20  EnableTrigger | 
16310 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
16320 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  l.#if !defined(S
16330 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
16340 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c  TOMATIC_INDEX) |
16350 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  | SQLITE_DEFAULT
16360 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
16370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16380 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49    | SQLITE_AutoI
16390 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndex.#endif.#if 
163a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
163b0 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
163d0 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
163e0 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
163f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16400 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
16430 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
16440 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
16450 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
16460 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
16470 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
16480 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
16490 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
164a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
164b0 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51  EIGN_KEYS) && SQ
164c0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
164d0 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20  EIGN_KEYS.      
164e0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
164f0 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a  ITE_ForeignKeys.
16500 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
16510 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53  ed(SQLITE_REVERS
16520 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45  E_UNORDERED_SELE
16530 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  CTS).           
16540 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
16550 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64  everseOrder.#end
16560 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c  if.      ;.  sql
16570 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
16580 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
16590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
165a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
165b0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
165c0 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
165d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
165e0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
165f0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
16600 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
16610 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
16620 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
16630 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
16640 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
16650 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
16660 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
16670 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
16680 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
16690 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
166a0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
166b0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49  e..  **.  ** EVI
166c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38  DENCE-OF: R-5278
166d0 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20 64  6-44878 SQLite d
166e0 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75 69  efines three bui
166f0 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a  lt-in collating.
16700 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a    ** functions:.
16710 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
16720 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
16730 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
16740 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
16750 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
16760 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
16770 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
16780 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
16790 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
167a0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
167b0 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
167c0 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e  _UTF16LE, 0, bin
167d0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
167e0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
167f0 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51  db, "NOCASE", SQ
16800 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f  LITE_UTF8, 0, no
16810 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
16820 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
16830 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54  ollation(db, "RT
16840 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  RIM", SQLITE_UTF
16850 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e  8, (void*)1, bin
16860 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
16870 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
16880 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
16890 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
168a0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
168b0 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32 32 34  F: R-08308-17224
168c0 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   The default col
168d0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
168e0 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72  for all.  ** str
168f0 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59 2e 20  ings is BINARY. 
16900 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c  .  */.  db->pDfl
16910 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  tColl = sqlite3F
16920 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  indCollSeq(db, S
16930 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e  QLITE_UTF8, "BIN
16940 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65  ARY", 0);.  asse
16950 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  rt( db->pDfltCol
16960 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61  l!=0 );..  /* Pa
16970 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rse the filename
16980 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a  /URI argument. *
16990 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67  /.  db->openFlag
169a0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20  s = flags;.  rc 
169b0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  = sqlite3ParseUr
169c0 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  i(zVfs, zFilenam
169d0 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e  e, &flags, &db->
169e0 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a  pVfs, &zOpen, &z
169f0 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
16a00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16a10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16a20 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d  TE_NOMEM ) db->m
16a30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
16a40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16a50 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
16a60 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
16a70 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
16a80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16a90 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
16aa0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
16ab0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
16ac0 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
16ad0 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
16ae0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
16af0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
16b00 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
16b10 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b30 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
16b40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
16b50 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
16b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16b70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
16b80 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
16b90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16ba0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
16bb0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
16bc0 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f   rc);.    goto o
16bd0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
16be0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16bf0 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
16c00 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  t);.  db->aDb[0]
16c10 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
16c20 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
16c30 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
16c40 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
16c50 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64  ocFailed ) ENC(d
16c60 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28  b) = SCHEMA_ENC(
16c70 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
16c80 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62  reeLeave(db->aDb
16c90 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
16ca0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
16cb0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
16cc0 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  t(db, 0);..  /* 
16cd0 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
16ce0 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
16cf0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
16d00 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68  s 'full'; for th
16d10 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
16d20 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45  base it is 'NONE
16d30 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  '. This matches 
16d40 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
16d50 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
16d60 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
16d70 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
16d80 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
16d90 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64  y_level = 3;.  d
16da0 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
16db0 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e  = "temp";.  db->
16dc0 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[1].safety_le
16dd0 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e  vel = 1;..  db->
16de0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
16df0 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
16e00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
16e10 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
16e20 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
16e30 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
16e40 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
16e50 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
16e60 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
16e70 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16e80 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
16e90 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
16ea0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
16eb0 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
16ec0 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
16ed0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
16ee0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
16ef0 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _OK);.  sqlite3R
16f00 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
16f10 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20  nctions(db);..  
16f20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69  /* Load automati
16f30 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65  c extensions - e
16f40 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68  xtensions that h
16f50 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65  ave been registe
16f60 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  red.  ** using t
16f70 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d  he sqlite3_autom
16f80 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29  atic_extension()
16f90 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20   API..  */.  rc 
16fa0 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
16fb0 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d  e(db);.  if( rc=
16fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16fd0 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61    sqlite3AutoLoa
16fe0 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  dExtensions(db);
16ff0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17000 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
17010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
17030 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17040 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
17050 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
17060 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
17070 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
17080 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
17090 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
170a0 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
170b0 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
170c0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
170d0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
170e0 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
170f0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
17100 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
17110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
17120 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
17130 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
17140 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
17150 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
17160 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
17170 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17180 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62  E_FTS3.  if( !db
17190 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
171a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
171b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
171c0 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b  te3Fts3Init(db);
171d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
171e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
171f0 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d  E_ICU.  if( !db-
17200 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17220 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17230 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
17240 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
17250 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17260 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
17270 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
17290 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
172a0 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
172b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
172c0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
172d0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
172e0 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
172f0 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
17300 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
17310 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
17320 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
17330 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
17340 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
17350 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
17360 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
17370 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
17380 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
17390 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
173a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
173b0 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
173c0 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
173d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
173e0 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
173f0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
17400 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
17410 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
17420 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
17450 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
17460 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
17470 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28   ) sqlite3Error(
17480 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45  db, rc);..  /* E
17490 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73  nable the lookas
174a0 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79  ide-malloc subsy
174b0 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c  stem */.  setupL
174c0 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20  ookaside(db, 0, 
174d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
174e0 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c  fig.szLookaside,
174f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17500 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17510 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
17520 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c  okaside);..  sql
17530 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
17540 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49  ckpoint(db, SQLI
17550 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41  TE_DEFAULT_WAL_A
17560 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a  UTOCHECKPOINT);.
17570 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73  .opendb_out:.  s
17580 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65  qlite3_free(zOpe
17590 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  n);.  if( db ){.
175a0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
175b0 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68  mutex!=0 || isTh
175c0 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73  readsafe==0 || s
175d0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
175e0 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30  ig.bFullMutex==0
175f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
17600 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
17610 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63  mutex);.  }.  rc
17620 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
17630 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  de(db);.  assert
17640 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  ( db!=0 || rc==S
17650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
17660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17670 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
17680 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
17690 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65      db = 0;.  }e
176a0 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
176b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
176c0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
176d0 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a  MAGIC_SICK;.  }.
176e0 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69    *ppDb = db;.#i
176f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17700 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
17710 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17720 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
17730 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20     /* Opening a 
17740 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  db handle. Fourt
17750 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
17760 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20  assed 0. */.    
17770 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c  void *pArg = sql
17780 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17790 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20  .pSqllogArg;.   
177a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
177b0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72  nfig.xSqllog(pAr
177c0 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65  g, db, zFilename
177d0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
177e0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
177f0 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
17800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
17810 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
17820 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
17830 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e  ite3_open(.  con
17840 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
17850 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
17860 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75  *ppDb .){.  retu
17870 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
17880 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  zFilename, ppDb,
17890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
178a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
178b0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
178c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
178d0 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  E, 0);.}.int sql
178e0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20  ite3_open_v2(.  
178f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
17900 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62  name,   /* Datab
17910 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54  ase filename (UT
17920 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
17930 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
17940 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65    /* OUT: SQLite
17950 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
17960 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
17970 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
17980 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
17990 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a   *zVfs        /*
179a0 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64   Name of VFS mod
179b0 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  ule to use */.){
179c0 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
179d0 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c  tabase(filename,
179e0 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64   ppDb, (unsigned
179f0 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73   int)flags, zVfs
17a00 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
17a10 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
17a20 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
17a30 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17a40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17a50 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74  _open16(.  const
17a60 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
17a70 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
17a80 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  pDb.){.  char co
17a90 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b  nst *zFilename8;
17aa0 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
17ab0 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38  encoded in UTF-8
17ac0 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d   instead of UTF-
17ad0 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  16 */.  sqlite3_
17ae0 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
17af0 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53  nt rc;..#ifdef S
17b00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
17b10 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44  _ARMOR.  if( ppD
17b20 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  b==0 ) return SQ
17b30 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
17b40 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62  ;.#endif.  *ppDb
17b50 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
17b60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
17b70 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
17b80 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
17b90 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
17ba0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69  n rc;.#endif.  i
17bb0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
17bc0 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c  ) zFilename = "\
17bd0 30 30 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c  000\000";.  pVal
17be0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
17bf0 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
17c00 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
17c10 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
17c20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
17c30 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  IVE, SQLITE_STAT
17c40 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  IC);.  zFilename
17c50 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  8 = sqlite3Value
17c60 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
17c70 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a  E_UTF8);.  if( z
17c80 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20  Filename8 ){.   
17c90 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61   rc = openDataba
17ca0 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70  se(zFilename8, p
17cb0 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
17cc0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17cd0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
17ce0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
17cf0 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61  REATE, 0);.    a
17d00 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20  ssert( *ppDb || 
17d10 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
17d20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
17d30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62  SQLITE_OK && !Db
17d40 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44  HasProperty(*ppD
17d50 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
17d60 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20  oaded) ){.      
17d70 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62  SCHEMA_ENC(*ppDb
17d80 29 20 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d  ) = ENC(*ppDb) =
17d90 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
17da0 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  IVE;.    }.  }el
17db0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
17dc0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
17dd0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
17de0 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
17df0 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
17e00 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64  t(0, rc);.}.#end
17e10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
17e20 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
17e30 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
17e40 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
17e50 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
17e60 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
17e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
17e80 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
17e90 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
17ea0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
17eb0 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
17ec0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
17ed0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
17ee0 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
17ef0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
17f00 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72  st void*).){.  r
17f10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
17f20 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
17f30 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63  2(db, zName, enc
17f40 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
17f50 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
17f60 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
17f70 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
17f80 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
17f90 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
17fa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
17fb0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
17fc0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
17fd0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
17fe0 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
17ff0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
18000 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
18010 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
18020 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
18030 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
18040 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
18050 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
18060 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18070 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
18080 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
18090 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
180a0 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
180b0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
180c0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
180d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
180e0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
180f0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
18100 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18110 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
18120 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
18130 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
18140 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
18150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
18160 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
18170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18180 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
18190 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
181a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
181b0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
181c0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
181d0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
181e0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
181f0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
18200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
18210 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
18220 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
18230 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
18240 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
18250 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
18260 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
18270 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
18280 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
18290 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
182a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
182b0 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
182c0 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
182d0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
182e0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
182f0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
18300 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
18310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
18320 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
18330 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
18340 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
18350 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
18360 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18370 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
18380 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
18390 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
183a0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
183b0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
183c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
183d0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
183e0 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
183f0 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
18400 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
18410 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
18420 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
18430 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
18440 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
18450 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
18460 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
18470 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
18480 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
18490 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
184a0 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
184b0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
184c0 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
184d0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
184e0 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
184f0 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
18500 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
18510 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18520 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
18530 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
18540 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
18550 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
18560 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
18570 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
18580 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
18590 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
185a0 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
185b0 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
185c0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
185d0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
185e0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
185f0 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
18600 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
18610 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18620 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
18630 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
18640 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
18650 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
18660 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
18670 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
18680 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
18690 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
186a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
186b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
186c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
186d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
186e0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
186f0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
18700 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
18710 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
18720 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
18730 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
18740 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
18750 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
18760 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
18770 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
18780 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
18790 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
187a0 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
187b0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
187c0 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
187d0 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
187e0 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
187f0 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
18800 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23  onst void*).){.#
18810 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18820 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
18830 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
18840 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
18850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
18860 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
18870 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
18880 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
18890 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
188a0 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
188b0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
188c0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
188d0 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
188e0 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
188f0 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
18900 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
18910 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
18920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
18930 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18940 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
18950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18960 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
18970 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18980 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
18990 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
189a0 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
189b0 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
189c0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
189d0 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
189e0 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
189f0 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
18a00 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
18a10 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
18a20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18a30 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
18a40 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
18a50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
18a60 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
18a70 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
18a80 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
18a90 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
18aa0 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
18ab0 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
18ac0 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
18ad0 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
18ae0 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
18af0 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
18b00 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
18b10 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
18b20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
18b30 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a  or ROLLBACK..*/.
18b40 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
18b50 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
18b60 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
18b70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
18b80 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
18b90 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
18ba0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
18bb0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
18bc0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
18bd0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
18be0 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  f.  return db->a
18bf0 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
18c00 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
18c10 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
18c20 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63  ubstitutes for c
18c30 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
18c40 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
18c50 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
18c60 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
18c70 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73  TE_IOERR and pos
18c80 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
18c90 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
18ca0 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20   They serve two 
18cb0 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
18cc0 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
18cd0 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
18ce0 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
18cf0 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
18d00 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
18d10 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
18d20 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
18d30 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
18d40 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
18d50 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
18d60 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
18d70 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
18d80 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
18d90 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
18da0 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
18db0 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
18dc0 69 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72  ite3CorruptError
18dd0 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
18de0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
18df0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
18e00 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
18e10 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f  e3_log(SQLITE_CO
18e20 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20  RRUPT,.         
18e30 20 20 20 20 20 22 64 61 74 61 62 61 73 65 20 63       "database c
18e40 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e  orruption at lin
18e50 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
18e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18e70 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
18e80 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
18e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18ea0 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73  CORRUPT;.}.int s
18eb0 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f  qlite3MisuseErro
18ec0 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
18ed0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
18ee0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
18ef0 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
18f00 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d  te3_log(SQLITE_M
18f10 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20  ISUSE, .        
18f20 20 20 20 20 20 20 22 6d 69 73 75 73 65 20 61 74        "misuse at
18f30 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
18f40 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
18f50 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
18f60 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
18f70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
18f80 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e  ITE_MISUSE;.}.in
18f90 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65  t sqlite3Cantope
18fa0 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  nError(int linen
18fb0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
18fc0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18fd0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
18fe0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
18ff0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20  ITE_CANTOPEN, . 
19000 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
19010 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61  nnot open file a
19020 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
19030 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
19040 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b       lineno, 20+
19050 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
19060 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ());.  return SQ
19070 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d  LITE_CANTOPEN;.}
19080 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
19090 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
190a0 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  D./*.** This is 
190b0 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  a convenience ro
190c0 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73  utine that makes
190d0 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
190e0 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a  hread-specific.*
190f0 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  * data for this 
19100 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20  thread has been 
19110 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  deallocated..**.
19120 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  ** SQLite no lon
19130 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d  ger uses thread-
19140 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f  specific data so
19150 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19160 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e   now a.** no-op.
19170 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64    It is retained
19180 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
19190 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a  compatibility..*
191a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74  /.void sqlite3_t
191b0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f  hread_cleanup(vo
191c0 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  id){.}.#endif../
191d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61  *.** Return meta
191e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
191f0 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f  ut a specific co
19200 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61  lumn of a databa
19210 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65  se table..** See
19220 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69   comment in sqli
19230 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e  te3.h (sqlite.h.
19240 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  in) for details.
19250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
19260 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
19270 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
19280 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
19290 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
192a0 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
192b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
192c0 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
192d0 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
192e0 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
192f0 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
19300 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
19310 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
19320 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
19330 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
19340 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
19350 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
19360 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
19370 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
19380 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
19390 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
193a0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
193b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
193c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
193d0 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
193e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
193f0 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
19400 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
19410 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
19420 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
19430 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
19440 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
19450 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
19460 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
19470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19480 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
19490 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
194a0 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
194b0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
194c0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
194d0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
194e0 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
194f0 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a   0;.  int iCol;.
19500 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
19510 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
19520 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
19530 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
19540 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
19550 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
19560 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
19570 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75   = 0;..  /* Ensu
19580 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
19590 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
195a0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
195b0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
195c0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
195d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
195e0 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
195f0 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
19600 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
19610 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
19620 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
19630 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
19640 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
19650 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
19660 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
19670 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
19680 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
19690 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
196a0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
196b0 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
196c0 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
196d0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
196e0 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
196f0 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
19700 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
19710 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d  if( zColumnName=
19720 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65  =0 ){.    /* Que
19730 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65  ry for existance
19740 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a   of table only *
19750 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
19760 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
19770 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
19780 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  ++){.      pCol 
19790 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
197a0 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ol];.      if( 0
197b0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
197c0 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
197d0 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
197e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
197f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
19800 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e  f( iCol==pTab->n
19810 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
19820 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
19830 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
19840 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  d(zColumnName) )
19850 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
19860 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
19870 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f        pCol = iCo
19880 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43  l>=0 ? &pTab->aC
19890 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20  ol[iCol] : 0;.  
198a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
198b0 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
198c0 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
198d0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
198e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
198f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
19900 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61   stores the meta
19910 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
19920 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
19930 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63  ed.  ** to the c
19940 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76  aller in local v
19950 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79  ariables zDataTy
19960 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f  pe, zCollSeq, no
19970 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65  tnull, primaryke
19980 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69  y.  ** and autoi
19990 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  nc. At this poin
199a0 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  t there are two 
199b0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20  possibilities:. 
199c0 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e   ** .  **     1.
199d0 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63   The specified c
199e0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72  olumn name was r
199f0 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20  owid", "oid" or 
19a00 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20  "_rowid_" .  ** 
19a10 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65         and there
19a20 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c   is no explicitl
19a30 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63  y declared IPK c
19a40 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a  olumn. .  **.  *
19a50 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62  *     2. The tab
19a60 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  le is not a view
19a70 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
19a80 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20  name identified 
19a90 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  an .  **        
19aa0 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
19ab0 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79  red column. Copy
19ac0 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
19ad0 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20  n from *pCol..  
19ae0 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29  */ .  if( pCol )
19af0 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
19b00 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
19b10 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43     zCollSeq = pC
19b20 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e  ol->zColl;.    n
19b30 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e  otnull = pCol->n
19b40 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70  otNull!=0;.    p
19b50 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43  rimarykey  = (pC
19b60 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
19b70 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
19b80 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20  =0;.    autoinc 
19b90 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  = pTab->iPKey==i
19ba0 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61  Col && (pTab->ta
19bb0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
19bc0 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20  increment)!=0;. 
19bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74   }else{.    zDat
19be0 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  aType = "INTEGER
19bf0 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  ";.    primaryke
19c00 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 1;.  }.  if(
19c10 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20   !zCollSeq ){.  
19c20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49    zCollSeq = "BI
19c30 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f  NARY";.  }..erro
19c40 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
19c50 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
19c60 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
19c70 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
19c80 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
19c90 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
19ca0 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
19cb0 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
19cc0 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
19cd0 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
19ce0 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
19cf0 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
19d00 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
19d10 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
19d20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
19d30 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
19d40 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
19d50 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
19d60 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
19d70 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
19d80 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
19d90 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
19da0 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
19db0 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
19dc0 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
19dd0 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
19de0 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
19df0 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
19e00 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
19e10 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
19e20 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
19e30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19e40 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
19e50 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
19e60 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
19e70 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
19e80 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
19e90 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
19ea0 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
19eb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
19ec0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
19ed0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
19ee0 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
19ef0 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
19f00 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
19f10 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
19f20 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19f30 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
19f40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19f50 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
19f60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19f70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  }../*.** Sleep f
19f80 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
19f90 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
19fa0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
19fb0 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
19fc0 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
19fd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
19fe0 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
19ff0 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
1a000 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1a010 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
1a020 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
1a030 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
1a040 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
1a050 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
1a060 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
1a070 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
1a080 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
1a090 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
1a0a0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
1a0b0 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
1a0c0 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
1a0d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a0e0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
1a0f0 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
1a100 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
1a110 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
1a120 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
1a130 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
1a140 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
1a150 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f){.#ifdef SQLIT
1a160 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1a170 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1a180 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1a190 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1a1a0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1a1b0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1a1c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1a1d0 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
1a1e0 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
1a1f0 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
1a200 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
1a210 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1a220 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1a230 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a240 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
1a250 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
1a260 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
1a270 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
1a280 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
1a290 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
1a2a0 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1a2b0 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
1a2c0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1a2d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a2e0 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
1a2f0 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66  *pBtree;..#ifdef
1a300 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1a310 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1a320 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1a330 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1a340 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1a350 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1a360 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1a370 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1a380 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65   pBtree = sqlite
1a390 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1a3a0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  b, zDbName);.  i
1a3b0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1a3c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
1a3d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1a3e0 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65   *fd;.    sqlite
1a3f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1a400 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ee);.    pPager 
1a410 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
1a420 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
1a430 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1a440 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73  =0 );.    fd = s
1a450 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
1a460 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
1a470 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
1a480 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
1a490 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
1a4a0 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1a4b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1a4c0 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72  rg = fd;.      r
1a4d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a4e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d     }else if( fd-
1a4f0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1a500 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a510 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c  sFileControl(fd,
1a520 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20   op, pArg);.    
1a530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1a540 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
1a550 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
1a560 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1a570 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Btree);.  }.  sq
1a580 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a590 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1a5a0 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a  return rc;   .}.
1a5b0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1a5c0 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
1a5d0 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
1a5e0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1a5f0 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
1a600 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
1a610 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a620 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
1a630 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1a640 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
1a650 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
1a660 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  {..    /*.    **
1a670 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
1a680 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  t state of the P
1a690 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RNG..    */.    
1a6a0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1a6b0 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20  CTRL_PRNG_SAVE: 
1a6c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1a6d0 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a  rngSaveState();.
1a6e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a6f0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1a700 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74  * Restore the st
1a710 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20  ate of the PRNG 
1a720 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74  to the last stat
1a730 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20  e saved using.  
1a740 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20    ** PRNG_SAVE. 
1a750 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61   If PRNG_SAVE ha
1a760 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
1a770 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  een called, then
1a780 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72  .    ** this ver
1a790 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47  b acts like PRNG
1a7a0 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20  _RESET..    */. 
1a7b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1a7c0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
1a7d0 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TORE: {.      sq
1a7e0 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65  lite3PrngRestore
1a7f0 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
1a800 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a810 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74   /*.    ** Reset
1a820 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74   the PRNG back t
1a830 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69  o its uninitiali
1a840 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20  zed state.  The 
1a850 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  next call.    **
1a860 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   to sqlite3_rand
1a870 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65  omness() will re
1a880 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73  seed the PRNG us
1a890 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ing a single cal
1a8a0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  l.    ** to the 
1a8b0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68  xRandomness meth
1a8c0 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  od of the defaul
1a8d0 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20  t VFS..    */.  
1a8e0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1a8f0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
1a900 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1a910 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c  e3_randomness(0,
1a920 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1a930 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1a940 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1a950 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56  est_control(BITV
1a960 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70  EC_TEST, size, p
1a970 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20  rogram).    **. 
1a980 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74     ** Run a test
1a990 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65   against a Bitve
1a9a0 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65  c object of size
1a9b0 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61  .  The program a
1a9c0 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69  rgument.    ** i
1a9d0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
1a9e0 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69  tegers that defi
1a9f0 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52  nes the test.  R
1aa00 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20  eturn -1 on a.  
1aa10 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
1aa20 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20  cation error, 0 
1aa30 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e  on success, or n
1aa40 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65  on-zero for an e
1aa50 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65  rror..    ** See
1aa60 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76   the sqlite3Bitv
1aa70 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20  ecBuiltinTest() 
1aa80 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
1aa90 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
1aaa0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1aab0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
1aac0 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20  EC_TEST: {.     
1aad0 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
1aae0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1aaf0 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61   int *aProg = va
1ab00 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
1ab10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ab20 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
1ab30 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a  est(sz, aProg);.
1ab40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ab50 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1ab60 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1ab70 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e  control(FAULT_IN
1ab80 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b  STALL, xCallback
1ab90 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1aba0 41 72 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b  Arrange to invok
1abb0 65 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68  e xCallback() wh
1abc0 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33 46 61  enever sqlite3Fa
1abd0 75 6c 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c  ultSim() is call
1abe0 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43  ed,.    ** if xC
1abf0 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e  allback is not N
1ac00 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ULL..    **.    
1ac10 2a 2a 20 41 73 20 61 20 74 65 73 74 20 6f 66 20  ** As a test of 
1ac20 74 68 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61  the fault simula
1ac30 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74  tor mechanism it
1ac40 73 65 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75  self, sqlite3Fau
1ac50 6c 74 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20  ltSim(0).    ** 
1ac60 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69  is called immedi
1ac70 61 74 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74  ately after inst
1ac80 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63  alling the new c
1ac90 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20  allback and the 
1aca0 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61  return.    ** va
1acb0 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  lue from sqlite3
1acc0 46 61 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f  FaultSim(0) beco
1acd0 6d 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 66  mes the return f
1ace0 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
1acf0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ad00 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  )..    */.    ca
1ad10 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ad20 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  RL_FAULT_INSTALL
1ad30 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56  : {.      /* MSV
1ad40 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74  C is picky about
1ad50 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74   pulling func pt
1ad60 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73  rs from va lists
1ad70 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a  ..      ** http:
1ad80 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73  //support.micros
1ad90 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31  oft.com/kb/47961
1ada0 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
1adb0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54  3GlobalConfig.xT
1adc0 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61  estCallback = va
1add0 5f 61 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28  _arg(ap, int(*)(
1ade0 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  int));.      */.
1adf0 20 20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e        typedef in
1ae00 74 28 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46  t(*TESTCALLBACKF
1ae10 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20  UNC_t)(int);.   
1ae20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1ae30 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c  Config.xTestCall
1ae40 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70  back = va_arg(ap
1ae50 2c 20 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55  , TESTCALLBACKFU
1ae60 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20  NC_t);.      rc 
1ae70 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  = sqlite3FaultSi
1ae80 6d 28 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  m(0);.      brea
1ae90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1aea0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1aeb0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45  _test_control(BE
1aec0 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
1aed0 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29  S, xBegin, xEnd)
1aee0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1aef0 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f  egister hooks to
1af00 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74   call to indicat
1af10 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29  e which malloc()
1af20 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a   failures .    *
1af30 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20  * are benign..  
1af40 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1af50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45  LITE_TESTCTRL_BE
1af60 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
1af70 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  S: {.      typed
1af80 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66  ef void (*void_f
1af90 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a  unction)(void);.
1afa0 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
1afb0 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e  ion xBenignBegin
1afc0 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
1afd0 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64  ction xBenignEnd
1afe0 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42  ;.      xBenignB
1aff0 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70  egin = va_arg(ap
1b000 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
1b010 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45  ;.      xBenignE
1b020 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nd = va_arg(ap, 
1b030 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
1b040 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e        sqlite3Ben
1b050 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78  ignMallocHooks(x
1b060 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65  BenignBegin, xBe
1b070 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20  nignEnd);.      
1b080 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1b090 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1b0a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1b0b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1b0c0 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  L_PENDING_BYTE, 
1b0d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a  unsigned int X).
1b0e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
1b0f0 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  t the PENDING by
1b100 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  te to the value 
1b110 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  in the argument,
1b120 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20   if X>0..    ** 
1b130 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
1b140 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e  if X==0.  Return
1b150 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1b160 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20  e pending byte. 
1b170 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73     ** as it exis
1b180 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73  ting before this
1b190 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1b1a0 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
1b1b0 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43  ** IMPORTANT:  C
1b1c0 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
1b1d0 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78  ING byte from 0x
1b1e0 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73  40000000 results
1b1f0 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e   in.    ** an in
1b200 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62  compatible datab
1b210 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ase file format.
1b220 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
1b230 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20  ENDING byte.    
1b240 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74  ** while any dat
1b250 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1b260 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73   is open results
1b270 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   in undefined an
1b280 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72  d.    ** deleter
1b290 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20  ious behavior.. 
1b2a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1b2b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1b2c0 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20  ENDING_BYTE: {. 
1b2d0 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e       rc = PENDIN
1b2e0 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20  G_BYTE;.#ifndef 
1b2f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1b300 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b310 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77  unsigned int new
1b320 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Val = va_arg(ap,
1b330 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a   unsigned int);.
1b340 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56          if( newV
1b350 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64  al ) sqlite3Pend
1b360 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c  ingByte = newVal
1b370 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1b380 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b390 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1b3a0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1b3b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1b3c0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
1b3d0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1b3e0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
1b3f0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
1b400 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
1b410 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
1b420 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
1b430 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
1b440 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49  compile-time.  I
1b450 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20  f X is true and 
1b460 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20  assert().    ** 
1b470 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
1b480 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1b490 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58  e is true.  If X
1b4a0 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20   is true and.   
1b4b0 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20   ** assert() is 
1b4c0 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
1b4d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1b4e0 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69  is zero.  If X i
1b4f0 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61  s.    ** false a
1b500 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65  nd assert() is e
1b510 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
1b520 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73   assertion fires
1b530 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
1b540 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20  process aborts. 
1b550 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61   If X is false a
1b560 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64  nd assert() is d
1b570 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
1b580 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  e.    ** return 
1b590 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20  value is zero.. 
1b5a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1b5b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1b5c0 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76  SSERT: {.      v
1b5d0 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20  olatile int x = 
1b5e0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
1b5f0 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (x = va_arg(ap,
1b600 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  int))!=0 );.    
1b610 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20    rc = x;.      
1b620 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
1b630 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1b640 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1b650 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1b660 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58  RL_ALWAYS, int X
1b670 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1b680 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1b690 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1b6a0 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20  test to see how 
1b6b0 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20  the ALWAYS and. 
1b6c0 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72     ** NEVER macr
1b6d0 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  os were defined 
1b6e0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1b6f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1b700 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1b710 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a  is ALWAYS(X).  .
1b720 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1b730 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
1b740 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
1b750 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1b760 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
1b770 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
1b780 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1b790 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
1b7a0 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
1b7b0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
1b7c0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
1b7d0 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
1b7e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
1b7f0 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
1b800 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
1b810 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
1b820 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
1b830 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
1b840 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
1b850 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
1b860 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
1b870 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
1b880 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1b890 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1b8a0 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1b8b0 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1b8c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
1b8d0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
1b8e0 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
1b8f0 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
1b900 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
1b910 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
1b920 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1b930 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1b940 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1b950 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
1b960 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
1b970 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
1b980 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
1b990 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
1b9a0 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
1b9b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1b9c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
1b9d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1b9e0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1b9f0 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
1ba00 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1ba10 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1ba20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
1ba30 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
1ba40 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
1ba50 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1ba60 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ba70 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
1ba80 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
1ba90 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
1baa0 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
1bab0 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
1bac0 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
1bad0 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
1bae0 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
1baf0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
1bb00 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
1bb10 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
1bb20 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
1bb30 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
1bb40 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1bb50 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
1bb60 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1bb70 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1bb80 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78     rc = ALWAYS(x
1bb90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bba0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1bbb0 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    **   sqlite3_t
1bbc0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1bbd0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1bbe0 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20  ORDER);.    **. 
1bbf0 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65     ** The intege
1bc00 72 20 72 65 74 75 72 6e 65 64 20 72 65 76 65 61  r returned revea
1bc10 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65  ls the byte-orde
1bc20 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65  r of the compute
1bc30 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a  r on which.    *
1bc40 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e  * SQLite is runn
1bc50 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ing:.    **.    
1bc60 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 62  **       1     b
1bc70 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65  ig-endian,    de
1bc80 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d  termined at run-
1bc90 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  time.    **     
1bca0 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65   10     little-e
1bcb0 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1bcc0 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
1bcd0 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20    **  432101    
1bce0 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20   big-endian,    
1bcf0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1bd00 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1bd10 2a 20 20 31 32 33 34 31 30 20 20 20 20 20 6c 69  *  123410     li
1bd20 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1bd30 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
1bd40 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a  le-time.    */ .
1bd50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bd60 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44  TESTCTRL_BYTEORD
1bd70 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ER: {.      rc =
1bd80 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
1bd90 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c  R*100 + SQLITE_L
1bda0 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b  ITTLEENDIAN*10 +
1bdb0 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41   SQLITE_BIGENDIA
1bdc0 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  N;.      break;.
1bdd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1bde0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1bdf0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1be00 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71  CTRL_RESERVE, sq
1be10 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
1be20 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1be30 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65  Set the nReserve
1be40 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74   size to N for t
1be50 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1be60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1be70 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  .    ** connecti
1be80 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  on db..    */.  
1be90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1bea0 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20  STCTRL_RESERVE: 
1beb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1bec0 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1bed0 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1bee0 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1bef0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1bf00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1bf10 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1bf20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1bf30 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62  eeSetPageSize(db
1bf40 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
1bf50 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   x, 0);.      sq
1bf60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1bf70 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1bf80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bf90 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
1bfa0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1bfb0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1bfc0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71  PTIMIZATIONS, sq
1bfd0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
1bfe0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1bff0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
1c000 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  e various optimi
1c010 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74  zations for test
1c020 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
1c030 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d  he .    ** argum
1c040 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61  ent N is a bitma
1c050 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  sk of optimizati
1c060 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ons to be disabl
1c070 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a  ed.  For normal.
1c080 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
1c090 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20   N should be 0. 
1c0a0 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
1c0b0 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d  t a test program
1c0c0 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a   (like the.    *
1c0d0 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74  * SQL Logic Test
1c0e0 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64   or SLT test mod
1c0f0 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65  ule) can run the
1c100 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70   same SQL multip
1c110 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20  le times.    ** 
1c120 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74  with various opt
1c130 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62  imizations disab
1c140 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68  led to verify th
1c150 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1c160 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74  er.    ** is obt
1c170 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63  ained in every c
1c180 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1c190 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1c1a0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1c1b0 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NS: {.      sqli
1c1c0 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1c1d0 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1c1e0 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46        db->dbOptF
1c1f0 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f  lags = (u16)(va_
1c200 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30  arg(ap, int) & 0
1c210 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72  xffff);.      br
1c220 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
1c230 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  ef SQLITE_N_KEYW
1c240 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  ORD.    /* sqlit
1c250 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c260 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c270 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74  ISKEYWORD, const
1c280 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20   char *zWord).  
1c290 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a    **.    ** If z
1c2a0 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72  Word is a keywor
1c2b0 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20  d recognized by 
1c2c0 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e  the parser, then
1c2d0 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20   return the.    
1c2e0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79  ** number of key
1c2f0 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57  words.  Or if zW
1c300 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79  ord is not a key
1c310 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  word, return 0..
1c320 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54      ** .    ** T
1c330 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72 65  his test feature
1c340 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
1c350 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61  le in the amalga
1c360 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20  mation since.   
1c370 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e   ** the SQLITE_N
1c380 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69  _KEYWORD macro i
1c390 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e  s not defined in
1c3a0 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53 51   this file if SQ
1c3b0 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  Lite.    ** is b
1c3c0 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72  uilt using separ
1c3d0 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73  ate source files
1c3e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c3f0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1c400 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20  L_ISKEYWORD: {. 
1c410 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c420 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28  *zWord = va_arg(
1c430 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
1c440 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
1c450 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1c460 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63  zWord);.      rc
1c470 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f   = (sqlite3Keywo
1c480 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72  rdCode((u8*)zWor
1c490 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20  d, n)!=TK_ID) ? 
1c4a0 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
1c4b0 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   : 0;.      brea
1c4c0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1c4d0 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ..    /* sqlite3
1c4e0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1c4f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43  LITE_TESTCTRL_SC
1c500 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c  RATCHMALLOC, sz,
1c510 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a   &pNew, pFree);.
1c520 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61      **.    ** Pa
1c530 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71  ss pFree into sq
1c540 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
1c550 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73  (). .    ** If s
1c560 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  z>0 then allocat
1c570 65 20 61 20 73 63 72 61 74 63 68 20 62 75 66 66  e a scratch buff
1c580 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a  er into pNew.  .
1c590 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c5a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c5b0 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b  SCRATCHMALLOC: {
1c5c0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72  .      void *pFr
1c5d0 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20  ee, **ppNew;.   
1c5e0 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20     int sz;.     
1c5f0 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
1c600 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e   int);.      ppN
1c610 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ew = va_arg(ap, 
1c620 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70  void**);.      p
1c630 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Free = va_arg(ap
1c640 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
1c650 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20  if( sz ) *ppNew 
1c660 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
1c670 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20  Malloc(sz);.    
1c680 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
1c690 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Free(pFree);.   
1c6a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c6b0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1c6c0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1c6d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
1c6e0 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20  OCALTIME_FAULT, 
1c6f0 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  int onoff);.    
1c700 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72  **.    ** If par
1c710 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20  ameter onoff is 
1c720 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67  non-zero, config
1c730 75 72 65 20 74 68 65 20 77 72 61 70 70 65 72 73  ure the wrappers
1c740 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20   so that all.   
1c750 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63   ** subsequent c
1c760 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d  alls to localtim
1c770 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73  e() and variants
1c780 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20   fail. If onoff 
1c790 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20  is zero,.    ** 
1c7a0 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e  undo this settin
1c7b0 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  g..    */.    ca
1c7c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c7d0 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
1c7e0 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LT: {.      sqli
1c7f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c800 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20  bLocaltimeFault 
1c810 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1c820 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c830 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1c840 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1c850 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1c860 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
1c870 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a  PT, int);.    **
1c880 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63  .    ** Set or c
1c890 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68 61 74  lear a flag that
1c8a0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1c8b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c8c0 65 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c  e is always well
1c8d0 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20  -.    ** formed 
1c8e0 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70  and never corrup
1c8f0 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73  t.  This flag is
1c900 20 63 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c   clear by defaul
1c910 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  t, indicating th
1c920 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  at.    ** databa
1c930 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68  se files might h
1c940 61 76 65 20 61 72 62 69 74 72 61 72 79 20 63 6f  ave arbitrary co
1c950 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69  rruption.  Setti
1c960 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75 72 69  ng the flag duri
1c970 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e  ng.    ** testin
1c980 67 20 63 61 75 73 65 73 20 63 65 72 74 61 69 6e  g causes certain
1c990 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1c9a0 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65  ents in the code
1c9b0 20 74 6f 20 62 65 20 61 63 74 69 76 61 74 65 64   to be activated
1c9c0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d  .    ** that dem
1c9d0 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e  onstrat invarian
1c9e0 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65  ts on well-forme
1c9f0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
1ca00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1ca10 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1ca20 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a  L_NEVER_CORRUPT:
1ca30 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1ca40 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76  GlobalConfig.nev
1ca50 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61  erCorrupt = va_a
1ca60 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1ca70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ca80 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1ca90 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1caa0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cab0 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78  VDBE_COVERAGE, x
1cac0 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a  Callback, ptr);.
1cad0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
1cae0 74 20 74 68 65 20 56 44 42 45 20 63 6f 76 65 72  t the VDBE cover
1caf0 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  age callback fun
1cb00 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61  ction to xCallba
1cb10 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20  ck with context 
1cb20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  .    ** pointer 
1cb30 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ptr..    */.    
1cb40 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1cb50 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41  CTRL_VDBE_COVERA
1cb60 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c  GE: {.#ifdef SQL
1cb70 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
1cb80 45 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  E.      typedef 
1cb90 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61  void (*branch_ca
1cba0 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
1cbb0 74 2c 75 38 2c 75 38 29 3b 0a 20 20 20 20 20 20  t,u8,u8);.      
1cbc0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cbd0 66 69 67 2e 78 56 64 62 65 42 72 61 6e 63 68 20  fig.xVdbeBranch 
1cbe0 3d 20 76 61 5f 61 72 67 28 61 70 2c 62 72 61 6e  = va_arg(ap,bran
1cbf0 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ch_callback);.  
1cc00 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1cc10 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65 42 72 61  lConfig.pVdbeBra
1cc20 6e 63 68 41 72 67 20 3d 20 76 61 5f 61 72 67 28  nchArg = va_arg(
1cc30 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  ap,void*);.#endi
1cc40 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
1cc50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1cc60 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1cc70 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1cc80 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c  TRL_SORTER_MMAP,
1cc90 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20   db, nMax); */. 
1cca0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1ccb0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
1ccc0 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  MAP: {.      sql
1ccd0 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1cce0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1ccf0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53  .      db->nMaxS
1cd00 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61  orterMmap = va_a
1cd10 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1cd20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cd30 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1cd40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1cd50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1cd60 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20  SINIT);.    **. 
1cd70 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c     ** Return SQL
1cd80 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65  ITE_OK if SQLite
1cd90 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61   has been initia
1cda0 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c 49 54 45  lized and SQLITE
1cdb0 5f 45 52 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a  _ERROR if.    **
1cdc0 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
1cdd0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1cde0 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a  TCTRL_ISINIT: {.
1cdf0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1ce00 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1ce10 49 6e 69 74 3d 3d 30 20 29 20 72 63 20 3d 20 53  Init==0 ) rc = S
1ce20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1ce30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ce40 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
1ce50 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1ce60 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
1ce70 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TEST */.  return
1ce80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1ce90 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
1cea0 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20  routine, useful 
1ceb0 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  to VFS implement
1cec0 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65  ations, that che
1ced0 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  cks.** to see if
1cee0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1cef0 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74 20   was a URI that 
1cf00 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63  contained a spec
1cf10 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70  ific query .** p
1cf20 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66  arameter, and if
1cf30 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20   so obtains the 
1cf40 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65  value of the que
1cf50 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  ry parameter..**
1cf60 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
1cf70 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1cf80 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74  e filename point
1cf90 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  er passed into t
1cfa0 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65  he xOpen().** me
1cfb0 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d  thod of a VFS im
1cfc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
1cfd0 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65  he zParam argume
1cfe0 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
1cff0 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70  f the.** query p
1d000 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b  arameter we seek
1d010 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1d020 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75  returns the valu
1d030 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a  e of the zParam.
1d040 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66 20  ** parameter if 
1d050 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20 74  it exists.  If t
1d060 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65  he parameter doe
1d070 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69  s not exist, thi
1d080 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
1d090 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  urns a NULL poin
1d0a0 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ter..*/.const ch
1d0b0 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f  ar *sqlite3_uri_
1d0c0 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20  parameter(const 
1d0d0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1d0e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1d0f0 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c  ram){.  if( zFil
1d100 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72  ename==0 || zPar
1d110 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  am==0 ) return 0
1d120 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d  ;.  zFilename +=
1d130 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1d140 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
1d150 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e  .  while( zFilen
1d160 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
1d170 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69  t x = strcmp(zFi
1d180 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1d190 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
1d1a0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1d1b0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1d1c0 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29  ;.    if( x==0 )
1d1d0 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1d1e0 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  e;.    zFilename
1d1f0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1d200 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1d210 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1d220 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
1d230 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  urn a boolean va
1d240 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
1d250 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e  parameter..*/.in
1d260 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  t sqlite3_uri_bo
1d270 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72  olean(const char
1d280 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
1d290 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
1d2a0 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63   int bDflt){.  c
1d2b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1d2c0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1d2d0 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
1d2e0 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74  zParam);.  bDflt
1d2f0 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72   = bDflt!=0;.  r
1d300 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65  eturn z ? sqlite
1d310 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62  3GetBoolean(z, b
1d320 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d  Dflt) : bDflt;.}
1d330 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1d340 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
1d350 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
1d360 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
1d370 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1d380 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28  lite3_uri_int64(
1d390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d3a0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
1d3b0 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73  Filename as pass
1d3c0 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20  ed to xOpen */. 
1d3d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1d3e0 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52  ram,       /* UR
1d3f0 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67  I parameter soug
1d400 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ht */.  sqlite3_
1d410 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20  int64 bDflt     
1d420 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70    /* return if p
1d430 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73  arameter is miss
1d440 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ing */.){.  cons
1d450 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1d460 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1d470 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
1d480 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ram);.  sqlite3_
1d490 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a  int64 v;.  if( z
1d4a0 20 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72   && sqlite3DecOr
1d4b0 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d  HexToI64(z, &v)=
1d4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d4d0 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d    bDflt = v;.  }
1d4e0 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b  .  return bDflt;
1d4f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d500 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74   the Btree point
1d510 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  er identified by
1d520 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72   zDbName.  Retur
1d530 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
1d540 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73  und..*/.Btree *s
1d550 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1d560 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
1d570 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1d580 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1d590 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1d5a0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1d5b0 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
1d5c0 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e  Bt.     && (zDbN
1d5d0 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
1d5e0 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65  3StrICmp(zDbName
1d5f0 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  , db->aDb[i].zNa
1d600 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20  me)==0).    ){. 
1d610 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e       return db->
1d620 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
1d630 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1d640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d650 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f  n the filename o
1d660 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1d670 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1d680 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1d690 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  nection..*/.cons
1d6a0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
1d6b0 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69  db_filename(sqli
1d6c0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1d6d0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1d6e0 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66   Btree *pBt;.#if
1d6f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1d700 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1d710 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1d720 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1d730 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1d740 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1d750 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
1d760 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71  endif.  pBt = sq
1d770 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1d780 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1d790 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
1d7a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
1d7b0 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30  ilename(pBt) : 0
1d7c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d7d0 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20  n 1 if database 
1d7e0 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  is read-only or 
1d7f0 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e  0 if read/write.
1d800 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a    Return -1 if.*
1d810 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61  * no such databa
1d820 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e  se exists..*/.in
1d830 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61  t sqlite3_db_rea
1d840 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64  donly(sqlite3 *d
1d850 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1d860 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1d870 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
1d880 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1d890 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1d8a0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1d8b0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
1d8c0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
1d8d0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
1d8e0 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
1d8f0 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
1d900 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1d910 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
1d920 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
1d930 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c  e3BtreeIsReadonl
1d940 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a     y(pBt) : -1;.}.