/ Hex Artifact Content
Login

Artifact ef3c25ce021d5ab6ffd29fcf993183bd31e2f9aa:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1110: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
1120: 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  nt bRunExtraInit
1130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1150: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
1160: 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ion needed */.#e
1170: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1180: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
11a0: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
11b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d0: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
11e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
11f0: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
1200: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
1210: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
1220: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
1230: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1240: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
1250: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
1260: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1270: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
1280: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
1290: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
12a0: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
12b0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
12c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
12f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1300: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1310: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1320: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
1330: 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ed.  If unable t
1340: 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  o .  ** initiali
1350: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
1360: 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65  system, return e
1370: 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72  arly with the er
1380: 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ror..  ** If the
1390: 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69   system is so si
13a0: 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75  ck that we are u
13b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13c0: 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20  e a mutex,.  ** 
13d0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  there is not muc
13e0: 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e  h SQLite is goin
13f0: 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  g to be able to 
1400: 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  do..  **.  ** Th
1410: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
1420: 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65  m must take care
1430: 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20   of serializing 
1440: 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69  its own.  ** ini
1450: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  tialization..  *
1460: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1470: 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69  MutexInit();.  i
1480: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1490: 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  c;..  /* Initial
14a0: 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29  ize the malloc()
14b0: 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20   system and the 
14c0: 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d  recursive pInitM
14d0: 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a  utex mutex..  **
14e0: 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
14f0: 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1500: 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45  the STATIC_MASTE
1510: 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74  R mutex.  Note t
1520: 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c  hat.  ** MutexAl
1530: 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20  loc() is called 
1540: 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74  for a static mut
1550: 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74  ex prior to init
1560: 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a  ializing the.  *
1570: 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  * malloc subsyst
1580: 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65  em - this implie
1590: 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  s that the alloc
15a0: 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69  ation of a stati
15b0: 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73  c.  ** mutex mus
15c0: 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75  t not require su
15d0: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d  pport from the m
15e0: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e  alloc subsystem.
15f0: 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  .  */.  MUTEX_LO
1600: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
1610: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1620: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1630: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
1640: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1650: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
1660: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1670: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
1680: 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71  t = 1;.  if( !sq
1690: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
16b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16c0: 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a  e3MallocInit();.
16d0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1700: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1710: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71  = 1;.    if( !sq
1720: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1730: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1750: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1760: 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20  utex =.         
1770: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c    sqlite3MutexAl
1780: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1790: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
17a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
17b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
17c0: 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65  Mutex && !sqlite
17d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
17e0: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
17f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1800: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1810: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1830: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1840: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1850: 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73  Mutex++;.  }.  s
1860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1870: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
1880: 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20  /* If rc is not 
1890: 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69  SQLITE_OK at thi
18a0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69  s point, then ei
18b0: 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a  ther the malloc.
18c0: 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63    ** subsystem c
18d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74  ould not be init
18e0: 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73  ialized or the s
18f0: 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20  ystem failed to 
1900: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68  allocate.  ** th
1910: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1920: 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  ex. Return an er
1930: 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61  ror in either ca
1940: 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  se.  */.  if( rc
1950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1960: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1970: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72  }..  /* Do the r
1980: 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69  est of the initi
1990: 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20  alization under 
19a0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75  the recursive mu
19b0: 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  tex so.  ** that
19c0: 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65   we will be able
19d0: 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72   to handle recur
19e0: 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a  sive calls into.
19f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1a00: 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20  tialize().  The 
1a10: 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1a20: 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68  normally come th
1a30: 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74  rough.  ** sqlit
1a40: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65  e3_os_init() whe
1a50: 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c  n it invokes sql
1a60: 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1a70: 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20  r(), but other. 
1a80: 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61   ** recursive ca
1a90: 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  lls might also b
1aa0: 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a  e possible..  **
1ab0: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
1ac0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30  TION-OF: R-00140
1ad0: 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75  -37445 SQLite au
1ae0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69  tomatically seri
1af0: 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a  alizes calls.  *
1b00: 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d  * to the xInit m
1b10: 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49  ethod, so the xI
1b20: 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20  nit method need 
1b30: 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66  not be threadsaf
1b40: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
1b50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78   following mutex
1b60: 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69   is what seriali
1b70: 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68  zes access to th
1b80: 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20  e appdef pcache 
1b90: 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f  xInit.  ** metho
1ba0: 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ds.  The sqlite3
1bb0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e  _pcache_methods.
1bc0: 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65  xInit() all is e
1bd0: 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20  mbedded in the. 
1be0: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
1bf0: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c00: 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  ize()..  */.  sq
1c10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c20: 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  r(sqlite3GlobalC
1c30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1c40: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1c50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1c60: 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  nit==0 && sqlite
1c70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1c80: 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20  Progress==0 ){. 
1c90: 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a     FuncDefHash *
1ca0: 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28  pHash = &GLOBAL(
1cb0: 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c  FuncDefHash, sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
1cd0: 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ons);.    sqlite
1ce0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1cf0: 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  Progress = 1;.  
1d00: 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20    memset(pHash, 
1d10: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
1d20: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1d30: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ));.    sqlite3R
1d40: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
1d50: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66  ctions();.    if
1d60: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1d70: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
1d80: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
1da0: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
1db0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1de0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1df0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
1e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e  rc = sqlite3OsIn
1e10: 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  it();.    }.    
1e20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e30: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e40: 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65  e3PCacheBufferSe
1e50: 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  tup( sqlite3Glob
1e60: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20  alConfig.pPage, 
1e70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
1e90: 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c  zPage, sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
1eb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1ed0: 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  nit = 1;.#ifdef 
1ee0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
1ef0: 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74 72  T.      bRunExtr
1f00: 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69  aInit = 1;.#endi
1f10: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
1f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f30: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
1f40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1f50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1f70: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
1f80: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
1f90: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
1fa0: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
1fb0: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
1fc0: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
1fd0: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
1fe0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ff0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
2000: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
2010: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2020: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
2030: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2040: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
2050: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
2060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
2070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
2080: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
2090: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20a0: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
20b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
20c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
20d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
20e0: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
20f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2100: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
2110: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
2120: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
2130: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
2140: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
2150: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
2160: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
2170: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
2180: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
2190: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
21a0: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
21b0: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
21c0: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
21d0: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
21e0: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
21f0: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
2200: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2210: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
2220: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
2230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2240: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
2250: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
2260: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
2270: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
2280: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2290: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
22a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22b0: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
22c0: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
22d0: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
22e0: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
22f0: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
2300: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
2310: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
2320: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
2330: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2340: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
2350: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
2360: 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69  .  /* Do extra i
2370: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74  nitialization st
2380: 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79  eps requested by
2390: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52   the SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70  A_INIT.  ** comp
23b0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
23c0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
23d0: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
23e0: 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e   if( bRunExtraIn
23f0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2400: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2410: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
2420: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58    rc = SQLITE_EX
2430: 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d  TRA_INIT(0);.  }
2440: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2450: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
2460: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
2470: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
2480: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
2490: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
24a0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
24b0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
24c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
24d0: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
24e0: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
24f0: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2500: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2510: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2520: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
2530: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
2540: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
2550: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
2560: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
2570: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
2580: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
2590: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
25a0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
25b0: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
25c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25d0: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
25e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
25f0: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2600: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2610: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2620: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2630: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2640: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2650: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2660: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
2670: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
2680: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
2690: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
26a0: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
26b0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
26c0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
26d0: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
26e0: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
26f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2700: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2720: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2730: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2740: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2750: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2760: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2770: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2780: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2790: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27a0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
27b0: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
27c0: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
27d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27e0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
27f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2800: 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44  _OMIT_SHUTDOWN_D
2810: 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f  IRECTORIES.    /
2820: 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73 79  * The heap subsy
2830: 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65  stem has now bee
2840: 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74  n shutdown and t
2850: 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20  hese values are 
2860: 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20  supposed.    ** 
2870: 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  to be NULL or po
2880: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  int to memory th
2890: 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  at was obtained 
28a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
28b0: 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68  loc(),.    ** wh
28c0: 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f  ich would rely o
28d0: 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62 73  n that heap subs
28e0: 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65  ystem; therefore
28f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73  , make sure thes
2900: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2910: 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  cannot refer to 
2920: 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74  heap memory that
2930: 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69   was just invali
2940: 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20  dated when the. 
2950: 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79     ** heap subsy
2960: 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77  stem was shutdow
2970: 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  n.  This is only
2980: 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72   done if the cur
2990: 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  rent call to.   
29a0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
29b0: 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68  n resulted in th
29c0: 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  e heap subsystem
29d0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
29e0: 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f  shutdown..    */
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74  .    sqlite3_dat
2a00: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
2a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d  .    sqlite3_tem
2a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
2a30: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2a50: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2a60: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2a70: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
2a80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2a90: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2aa0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
2ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ac0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
2ad0: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
2ae0: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
2af0: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
2b00: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
2b10: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2b20: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
2b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b40: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2b50: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
2b60: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
2b70: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
2b80: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2b90: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2ba0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2bb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
2bc0: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
2bd0: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
2be0: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
2bf0: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
2c00: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
2c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
2c20: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
2c30: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2c40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c50: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
2c60: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
2c70: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
2c80: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
2c90: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
2ca0: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
2cb0: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
2cc0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
2cd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2ce0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
2cf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
2d00: 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  T;..  va_start(a
2d10: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
2d20: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
2d30: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
2d40: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
2d50: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
2d60: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
2d70: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a 20     ** compile.. 
2d80: 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65     */.#if define
2d90: 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  d(SQLITE_THREADS
2da0: 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  AFE) && SQLITE_T
2db0: 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f 2a 20  HREADSAFE>0  /* 
2dc0: 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34 36 37  IMP: R-54466-467
2dd0: 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  56 */.    case S
2de0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
2df0: 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  GLETHREAD: {.   
2e00: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c     /* Disable al
2e10: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
2e20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2e30: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
2e40: 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ex = 0;.      sq
2e50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2e60: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
2e70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2e80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
2e90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2ea0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
2eb0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
2ec0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32  0 /* IMP: R-2052
2ed0: 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63  0-54086 */.    c
2ee0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2ef0: 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b  G_MULTITHREAD: {
2f00: 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c  .      /* Disabl
2f10: 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64 61  e mutexing of da
2f20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2f30: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ns */.      /* E
2f40: 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f  nable mutexing o
2f50: 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72 75  f core data stru
2f60: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20 20  ctures */.      
2f70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2f80: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
2f90: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
2fa0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
2fb0: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20  ullMutex = 0;.  
2fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2fd0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
2fe0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
2ff0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3000: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3010: 20 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d 32 31   IMP: R-59593-21
3020: 38 31 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  810 */.    case 
3030: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45  SQLITE_CONFIG_SE
3040: 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20  RIALIZED: {.    
3050: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20    /* Enable all 
3060: 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20  mutexing */.    
3070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3080: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3090: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
30a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
30b0: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a  bFullMutex = 1;.
30c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30d0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
30e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
30f0: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
3100: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
3110: 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d  /* IMP: R-63666-
3120: 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63 61 73  48755 */.    cas
3130: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3140: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
3150: 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74  * Specify an alt
3160: 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69  ernative mutex i
3170: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
3180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3190: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
31a0: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
31b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
31c0: 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72  hods*);.      br
31d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
31e0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
31f0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29  LITE_THREADSAFE)
3200: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
3210: 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20  DSAFE>0 /* IMP: 
3220: 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20 2a 2f  R-14450-37597 */
3230: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3240: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58  _CONFIG_GETMUTEX
3250: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
3260: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
3270: 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  t mutex implemen
3280: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3290: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
32a0: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
32b0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
32c0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b  balConfig.mutex;
32d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
32f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3300: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
3310: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3320: 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30 33 30  F: R-55594-21030
3330: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
3340: 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e  IG_MALLOC option
3350: 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a   takes a.      *
3360: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3370: 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69  t which is a poi
3380: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
3390: 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  nce of the.     
33a0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f   ** sqlite3_mem_
33b0: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
33c0: 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
33d0: 73 70 65 63 69 66 69 65 73 20 61 6c 74 65 72 6e  specifies altern
33e0: 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c  ative.      ** l
33f0: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
3400: 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69  allocation routi
3410: 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 69  nes to be used i
3420: 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6d  n place of the m
3430: 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a 20 61  emory.      ** a
3440: 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  llocation routin
3450: 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20 53 51  es built into SQ
3460: 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73  Lite. */.      s
3470: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3480: 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61  ig.m = *va_arg(a
3490: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  p, sqlite3_mem_m
34a0: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
34b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
34c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
34d0: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b  FIG_GETMALLOC: {
34e0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
34f0: 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34  CE-OF: R-51213-4
3500: 36 34 31 34 20 54 68 65 20 53 51 4c 49 54 45 5f  6414 The SQLITE_
3510: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
3520: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a   option takes a.
3530: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3540: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
3550: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
3560: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3570: 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
3580: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3590: 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 73 71  tructure. The sq
35a0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
35b0: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 20  s structure is. 
35c0: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
35d0: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 6c  ith the currentl
35e0: 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  y defined memory
35f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
3600: 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ines. */.      i
3610: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3620: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
3630: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
3640: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
3650: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
3660: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3670: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3680: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
3690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36a0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
36b0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
36c0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  US: {.      /* E
36d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31  VIDENCE-OF: R-61
36e0: 32 37 35 2d 33 35 31 35 37 20 54 68 65 20 53 51  275-35157 The SQ
36f0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53  LITE_CONFIG_MEMS
3700: 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b  TATUS option tak
3710: 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67  es.      ** sing
3720: 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74  le argument of t
3730: 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72 70 72  ype int, interpr
3740: 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65 61  eted as a boolea
3750: 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c 65 73  n, which enables
3760: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64 69 73  .      ** or dis
3770: 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c 65 63  ables the collec
3780: 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61  tion of memory a
3790: 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74 69 73  llocation statis
37a0: 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tics. */.      s
37b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
37c0: 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61  ig.bMemstat = va
37d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
37e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3800: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
3810: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
3820: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30  DENCE-OF: R-0840
3830: 34 2d 36 30 38 38 37 20 54 68 65 72 65 20 61 72  4-60887 There ar
3840: 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74  e three argument
3850: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51  s to.      ** SQ
3860: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41  LITE_CONFIG_SCRA
3870: 54 43 48 3a 20 41 20 70 6f 69 6e 74 65 72 20 61  TCH: A pointer a
3880: 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  n 8-byte aligned
3890: 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20 66   memory buffer f
38a0: 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  rom.      ** whi
38b0: 63 68 20 74 68 65 20 73 63 72 61 74 63 68 20 61  ch the scratch a
38c0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20  llocations will 
38d0: 62 65 20 64 72 61 77 6e 2c 20 74 68 65 20 73 69  be drawn, the si
38e0: 7a 65 20 6f 66 20 65 61 63 68 20 73 63 72 61 74  ze of each scrat
38f0: 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ch.      ** allo
3900: 63 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64  cation (sz), and
3910: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
3920: 62 65 72 20 6f 66 20 73 63 72 61 74 63 68 20 61  ber of scratch a
3930: 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20  llocations (N). 
3940: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3950: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63  GlobalConfig.pSc
3960: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3970: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3980: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3990: 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d  nfig.szScratch =
39a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
39b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
39c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72  lobalConfig.nScr
39d0: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
39e0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
39f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3a00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3a10: 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20  G_PAGECACHE: {. 
3a20: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3a30: 2d 4f 46 3a 20 52 2d 33 31 34 30 38 2d 34 30 35  -OF: R-31408-405
3a40: 31 30 20 54 68 65 72 65 20 61 72 65 20 74 68 72  10 There are thr
3a50: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
3a60: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
3a70: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
3a80: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 38  : A pointer to 8
3a90: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3aa0: 6d 6f 72 79 2c 20 74 68 65 20 73 69 7a 65 0a 20  mory, the size. 
3ab0: 20 20 20 20 20 2a 2a 20 6f 66 20 65 61 63 68 20       ** of each 
3ac0: 70 61 67 65 20 62 75 66 66 65 72 20 28 73 7a 29  page buffer (sz)
3ad0: 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  , and the number
3ae0: 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e 20 2a   of pages (N). *
3af0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3b00: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
3b10: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
3b20: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3b30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b40: 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67  .szPage = va_arg
3b50: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3b60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3b70: 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f  nfig.nPage = va_
3b80: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3b90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3ba0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3bb0: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48  _CONFIG_PCACHE_H
3bc0: 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  DRSZ: {.      /*
3bd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3be0: 33 39 31 30 30 2d 32 37 33 31 37 20 54 68 65 20  39100-27317 The 
3bf0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
3c00: 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74 69 6f  ACHE_HDRSZ optio
3c10: 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a  n takes.      **
3c20: 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61 6d 65   a single parame
3c30: 74 65 72 20 77 68 69 63 68 20 69 73 20 61 20 70  ter which is a p
3c40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
3c50: 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 73 20  eger and writes 
3c60: 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  into.      ** th
3c70: 61 74 20 69 6e 74 65 67 65 72 20 74 68 65 20 6e  at integer the n
3c80: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 62  umber of extra b
3c90: 79 74 65 73 20 70 65 72 20 70 61 67 65 20 72 65  ytes per page re
3ca0: 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
3cb0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  page.      ** in
3cc0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3cd0: 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20 20  AGECACHE. */.   
3ce0: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 69     *va_arg(ap, i
3cf0: 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20 20 20  nt*) = .        
3d00: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
3d10: 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20 20 20  izeBtree() +.   
3d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65         sqlite3He
3d30: 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 28 29  aderSizePcache()
3d40: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   +.          sql
3d50: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50 63  ite3HeaderSizePc
3d60: 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20 20 62  ache1();.      b
3d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3d80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3d90: 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20  FIG_PCACHE: {.  
3da0: 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
3db0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3dc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3dd0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
3de0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3df0: 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  now an error */.
3e00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3e10: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3e30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3e40: 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20  FIG_PCACHE2: {. 
3e50: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3e60: 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34 38 33  -OF: R-63325-483
3e70: 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  78 The SQLITE_CO
3e80: 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f 70 74  NFIG_PCACHE2 opt
3e90: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
3ea0: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
3eb0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
3ec0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
3ed0: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3ee0: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
3ef0: 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62 6a 65  bject. This obje
3f00: 63 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65  ct specifies the
3f10: 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 20   interface to a 
3f20: 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61 63 68  custom page cach
3f30: 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  e.      ** imple
3f40: 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  mentation. */.  
3f50: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3f60: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20  lConfig.pcache2 
3f70: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
3f80: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3f90: 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62  hods2*);.      b
3fa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3fb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3fc0: 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b  IG_GETPCACHE2: {
3fd0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3fe0: 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d 34  CE-OF: R-22035-4
3ff0: 36 31 38 32 20 54 68 65 20 53 51 4c 49 54 45 5f  6182 The SQLITE_
4000: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
4010: 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  2 option takes a
4020: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
4030: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
4040: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4050: 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  an sqlite3_pcach
4060: 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20  e_methods2.     
4070: 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c 69   ** object. SQLi
4080: 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  te copies of the
4090: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 61   current page ca
40a0: 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  che implementati
40b0: 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a  on into.      **
40c0: 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a 2f   that object. */
40d0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
40e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
40f0: 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20  cache2.xInit==0 
4100: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4110: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
4120: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
4130: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
4140: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
4150: 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69  ethods2*) = sqli
4160: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4170: 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62  pcache2;.      b
4180: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a 20  reak;.    }../* 
4190: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
41a0: 36 36 32 36 2d 31 32 39 31 31 20 54 68 65 20 53  6626-12911 The S
41b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41  QLITE_CONFIG_HEA
41c0: 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  P option is only
41d0: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 66  .** available if
41e0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
41f0: 6c 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20  led with either 
4200: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4210: 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c 49  MSYS3 or.** SQLI
4220: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
4230: 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  5 and returns SQ
4240: 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 69 6e  LITE_ERROR if in
4250: 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73 65 2e  voked otherwise.
4260: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
4270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4280: 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65  MSYS3) || define
4290: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
42a0: 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73  MEMSYS5).    cas
42b0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
42c0: 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  HEAP: {.      /*
42d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
42e0: 31 39 38 35 34 2d 34 32 31 32 36 20 54 68 65 72  19854-42126 Ther
42f0: 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75  e are three argu
4300: 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  ments to.      *
4310: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  * SQLITE_CONFIG_
4320: 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74 65 20  HEAP: An 8-byte 
4330: 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65 72 20  aligned pointer 
4340: 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74  to the memory, t
4350: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  he.      ** numb
4360: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
4370: 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  he memory buffer
4380: 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75  , and the minimu
4390: 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  m allocation siz
43a0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
43b0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
43c0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
43d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
43e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
43f0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
4400: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4410: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4420: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4430: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4440: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4450: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4460: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
4470: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4480: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
4490: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
44a0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
44b0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
44c0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
44d0: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
44e0: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
44f0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
4500: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
4510: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
4520: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
4530: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
4540: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
4550: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4560: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32  DENCE-OF: R-4992
4570: 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20 66  0-60189 If the f
4580: 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74 68  irst pointer (th
4590: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
45a0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  ).        ** is 
45b0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74  NULL, then SQLit
45c0: 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73 69  e reverts to usi
45d0: 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20 6d  ng its default m
45e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a  emory allocator.
45f0: 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20          ** (the 
4600: 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20  system malloc() 
4610: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c  implementation),
4620: 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72 69   undoing any pri
4630: 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  or invocation of
4640: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  .        ** SQLI
4650: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
4660: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
4670: 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67 20       ** Setting 
4680: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4690: 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72  fig.m to all zer
46a0: 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d 61  os will cause ma
46b0: 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20 20  lloc to.        
46c0: 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74 73  ** revert to its
46d0: 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65   default impleme
46e0: 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c  ntation when sql
46f0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
4700: 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20 20  ) is run.       
4710: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   */.        mems
4720: 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61  et(&sqlite3Globa
4730: 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69  lConfig.m, 0, si
4740: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
4750: 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20  alConfig.m));.  
4760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4770: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
4780: 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31 38  F: R-61006-08918
4790: 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 70   If the memory p
47a0: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
47b0: 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  LL then the.    
47c0: 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69      ** alternati
47d0: 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ve memory alloca
47e0: 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20 74  tor is engaged t
47f0: 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20  o handle all of 
4800: 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20 20  SQLites.        
4810: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
4820: 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23  tion needs. */.#
4830: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4840: 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20  BLE_MEMSYS3.    
4850: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4860: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
4870: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
4880: 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3();.#endif.#ifd
4890: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
48a0: 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20  _MEMSYS5.       
48b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
48c0: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
48d0: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29  3MemGetMemsys5()
48e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
48f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4900: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
4910: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4920: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
4930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4940: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
4950: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4960: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
4970: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4980: 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  ig.nLookaside = 
4990: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
49a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49b0: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20    }.    .    /* 
49c0: 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  Record a pointer
49d0: 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66   to the logger f
49e0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20  unction and its 
49f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
4a00: 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75      ** The defau
4a10: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67  lt is NULL.  Log
4a20: 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  ging is disabled
4a30: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
4a40: 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20   pointer is.    
4a50: 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  ** NULL..    */.
4a60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4a70: 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20  CONFIG_LOG: {.  
4a80: 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
4a90: 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
4aa0: 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
4ab0: 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
4ac0: 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
4ad0: 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
4ae0: 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
4af0: 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
4b00: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
4b10: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a  a_arg(ap, void(*
4b20: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
4b30: 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
4b40: 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
4b50: 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f  f void(*LOGFUNC_
4b60: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  t)(void*,int,con
4b70: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
4b80: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b90: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
4ba0: 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74  rg(ap, LOGFUNC_t
4bb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4bc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f  GlobalConfig.pLo
4bd0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
4be0: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
4bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4c00: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4c10: 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37 20  : R-55548-33817 
4c20: 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  The compile-time
4c30: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52 49   setting for URI
4c40: 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a   filenames.    *
4c50: 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
4c60: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 75   at start-time u
4c70: 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
4c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
4c90: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
4ca0: 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  ,1) or.    ** sq
4cb0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
4cc0: 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30  ITE_CONFIG_URI,0
4cd0: 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ) configuration 
4ce0: 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  calls..    */.  
4cf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4d00: 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20  NFIG_URI: {.    
4d10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4d20: 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35 20  : R-25451-61125 
4d30: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
4d40: 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b  G_URI option tak
4d50: 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20  es a single.    
4d60: 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66    ** argument of
4d70: 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f   type int. If no
4d80: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49  n-zero, then URI
4d90: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f   handling is glo
4da0: 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65  bally.      ** e
4db0: 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20 70  nabled. If the p
4dc0: 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f  arameter is zero
4dd0: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
4de0: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
4df0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
4e00: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  d. */.      sqli
4e10: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e20: 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72  bOpenUri = va_ar
4e30: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
4e40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4e50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4e60: 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f  CONFIG_COVERING_
4e70: 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20  INDEX_SCAN: {.  
4e80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4e90: 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37 37  OF: R-36592-0277
4ea0: 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  2 The SQLITE_CON
4eb0: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
4ec0: 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a  EX_SCAN.      **
4ed0: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20   option takes a 
4ee0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61  single integer a
4ef0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
4f00: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
4f10: 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65  a.      ** boole
4f20: 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  an in order to e
4f30: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
4f40: 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76 65   the use of cove
4f50: 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f 72  ring indices for
4f60: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74  .      ** full t
4f70: 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74 68  able scans in th
4f80: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
4f90: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
4fa0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4fb0: 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72 67  bUseCis = va_arg
4fc0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
4fe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4ff0: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63  BLE_SQLLOG.    c
5000: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5010: 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20  G_SQLLOG: {.    
5020: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
5030: 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  SQLLOGFUNC_t)(vo
5040: 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  id*, sqlite3*, c
5050: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
5060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
5080: 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  log = va_arg(ap,
5090: 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a   SQLLOGFUNC_t);.
50a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50b0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
50c0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
50d0: 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20  , void *);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
50f0: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
5100: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5110: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
5120: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5130: 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53 51  R-58063-38258 SQ
5140: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
5150: 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f 20  _SIZE takes two 
5160: 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  64-bit.      ** 
5170: 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65 33  integer (sqlite3
5180: 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20 74  _int64) values t
5190: 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66 61  hat are the defa
51a0: 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69  ult mmap size li
51b0: 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  mit.      ** (th
51c0: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
51d0: 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61  g for PRAGMA mma
51e0: 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65 20  p_size) and the 
51f0: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a  maximum allowed.
5200: 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69        ** mmap si
5210: 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20  ze limit. */.   
5220: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
5230: 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   szMmap = va_arg
5240: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
5250: 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  64);.      sqlit
5260: 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20  e3_int64 mxMmap 
5270: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
5280: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
5290: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
52a0: 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39 30  F: R-53367-43190
52b0: 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75 6d   If either argum
52c0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74 69  ent to this opti
52d0: 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e  on is.      ** n
52e0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
52f0: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 63  at argument is c
5300: 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63 6f  hanged to its co
5310: 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61 75  mpile-time defau
5320: 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  lt..      **.   
5330: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
5340: 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33 31  F: R-34993-45031
5350: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
5360: 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20 77  owed mmap size w
5370: 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
5380: 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61 74  silently truncat
5390: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ed if necessary 
53a0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
53b0: 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a 20  not exceed the. 
53c0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
53d0: 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  time maximum mma
53e0: 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74 68  p size set by th
53f0: 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  e SQLITE_MAX_MMA
5400: 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20  P_SIZE.      ** 
5410: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
5420: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
5430: 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30      if( mxMmap<0
5440: 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54   || mxMmap>SQLIT
5450: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20  E_MAX_MMAP_SIZE 
5460: 29 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54  ) mxMmap = SQLIT
5470: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b  E_MAX_MMAP_SIZE;
5480: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61  .      if( szMma
5490: 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53  p<0 ) szMmap = S
54a0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
54b0: 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69  AP_SIZE;.      i
54c0: 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70  f( szMmap>mxMmap
54d0: 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  ) szMmap = mxMma
54e0: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
54f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
5500: 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20  map = mxMmap;.  
5510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5520: 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d  lConfig.szMmap =
5530: 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62   szMmap;.      b
5540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
5550: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26   SQLITE_OS_WIN &
5560: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5570: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f  _WIN32_MALLOC) /
5580: 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35  * IMP: R-04780-5
5590: 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65  5815 */.    case
55a0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57   SQLITE_CONFIG_W
55b0: 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b  IN32_HEAPSIZE: {
55c0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
55d0: 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30  CE-OF: R-34926-0
55e0: 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46  3360 SQLITE_CONF
55f0: 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a  IG_WIN32_HEAPSIZ
5600: 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74  E takes a 32-bit
5610: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e  .      ** unsign
5620: 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
5630: 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
5640: 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
5650: 20 6f 66 20 74 68 65 20 63 72 65 61 74 65 64 0a   of the created.
5660: 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a        ** heap. *
5670: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
5680: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
5690: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
56a0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
56b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
56c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
56d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
56e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
56f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5700: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5710: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5720: 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  ** Set up the lo
5730: 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20  okaside buffers 
5740: 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
5750: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65  onnection..** Re
5760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
5770: 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20  n success.  .** 
5780: 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20  If lookaside is 
5790: 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20  already active, 
57a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
57b0: 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a  SY..**.** The sz
57c0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
57d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
57e0: 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73  s in each lookas
57f0: 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65  ide slot..** The
5800: 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69   cnt parameter i
5810: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
5820: 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72  slots.  If pStar
5830: 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a  t is NULL the.**
5840: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c   space for the l
5850: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
5860: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
5870: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
5880: 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20  )..** If pStart 
5890: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
58a0: 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79   it is sz*cnt by
58b0: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  tes of memory to
58c0: 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20   use for.** the 
58d0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
58e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
58f0: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73  setupLookaside(s
5900: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
5910: 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20   *pBuf, int sz, 
5920: 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64  int cnt){.  void
5930: 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20   *pStart;.  if( 
5940: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
5950: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
5960: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
5970: 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  }.  /* Free any 
5980: 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69  existing lookasi
5990: 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68  de buffer for th
59a0: 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65  is handle before
59b0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67  .  ** allocating
59c0: 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65   a new one so we
59d0: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68   don't have to h
59e0: 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20  ave space for . 
59f0: 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20   ** both at the 
5a00: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  same time..  */.
5a10: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
5a20: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
5a30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5a40: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
5a50: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f  pStart);.  }.  /
5a60: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  * The size of a 
5a70: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61  lookaside slot a
5a80: 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20  fter ROUNDDOWN8 
5a90: 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67  needs to be larg
5aa0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70  er.  ** than a p
5ab0: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65  ointer to be use
5ac0: 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d  ful..  */.  sz =
5ad0: 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b   ROUNDDOWN8(sz);
5ae0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33    /* IMP: R-3303
5af0: 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28  8-09382 */.  if(
5b00: 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66   sz<=(int)sizeof
5b10: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
5b20: 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28   ) sz = 0;.  if(
5b30: 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30   cnt<0 ) cnt = 0
5b40: 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c  ;.  if( sz==0 ||
5b50: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73   cnt==0 ){.    s
5b60: 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  z = 0;.    pStar
5b70: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
5b80: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
5b90: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
5ba0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
5bb0: 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74    pStart = sqlit
5bc0: 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74  e3Malloc( sz*cnt
5bd0: 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36   );  /* IMP: R-6
5be0: 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20  1949-35727 */.  
5bf0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
5c00: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
5c10: 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74  if( pStart ) cnt
5c20: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
5c30: 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b  Size(pStart)/sz;
5c40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
5c50: 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d  tart = pBuf;.  }
5c60: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
5c70: 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74  .pStart = pStart
5c80: 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ;.  db->lookasid
5c90: 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64  e.pFree = 0;.  d
5ca0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20  b->lookaside.sz 
5cb0: 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28  = (u16)sz;.  if(
5cc0: 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69   pStart ){.    i
5cd0: 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73  nt i;.    Lookas
5ce0: 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20  ideSlot *p;.    
5cf0: 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e  assert( sz > (in
5d00: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
5d10: 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20  deSlot*) );.    
5d20: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
5d30: 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20  ot*)pStart;.    
5d40: 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d  for(i=cnt-1; i>=
5d50: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
5d60: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f  ->pNext = db->lo
5d70: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20  okaside.pFree;. 
5d80: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
5d90: 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20  de.pFree = p;.  
5da0: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
5db0: 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70  deSlot*)&((u8*)p
5dc0: 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  )[sz];.    }.   
5dd0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
5de0: 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d  End = p;.    db-
5df0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
5e00: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d  led = 1;.    db-
5e10: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
5e20: 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f  oced = pBuf==0 ?
5e30: 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1:0;.  }else{.  
5e40: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
5e50: 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20 20  pStart = db;.   
5e60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
5e70: 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  End = db;.    db
5e80: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
5e90: 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62  bled = 0;.    db
5ea0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
5eb0: 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  loced = 0;.  }. 
5ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5ed0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
5ee0: 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  rn the mutex ass
5ef0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
5f00: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5f10: 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d  on..*/.sqlite3_m
5f20: 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62  utex *sqlite3_db
5f30: 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a  _mutex(sqlite3 *
5f40: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
5f50: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
5f60: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
5f70: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
5f80: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
5f90: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
5fa0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
5fb0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
5fc0: 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78  return db->mutex
5fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
5fe0: 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  up as much memor
5ff0: 79 20 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d  y as we can from
6000: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
6010: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
6020: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
6030: 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
6040: 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ory(sqlite3 *db)
6050: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  {.  int i;..#ifd
6060: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6070: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
6080: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
6090: 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
60a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
60b0: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
60c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
60d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
60e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
60f0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
6100: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
6110: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
6120: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
6130: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
6140: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
6150: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
6160: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
6170: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
6180: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
6190: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
61a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
61b0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
61c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
61d0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
61e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
61f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
6200: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
6210: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
6220: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
6230: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
6240: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
6250: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
6260: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
6270: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
6280: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
6290: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
62a0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
62b0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
62c0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
62d0: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
62e0: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
62f0: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
6300: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
6310: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
6320: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
6330: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
6340: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
6350: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
6360: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
6370: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
6380: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
6390: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
63a0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
63b0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
63c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
63d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
63e0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
63f0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
6400: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
6410: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
6420: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
6430: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
6440: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
6450: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
6460: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
6470: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
6480: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
6490: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
64a0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
64b0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
64c0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
64d0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
64e0: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
64f0: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
6500: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
6510: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
6520: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
6530: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
6540: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
6550: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
6560: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
6570: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
6580: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
6590: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
65a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
65b0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
65c0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
65d0: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
65e0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
65f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
6600: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
6610: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
6620: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
6630: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
6640: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
6650: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
6660: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
6670: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
6680: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
6690: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
66a0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
66b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
66c0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
66d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
66e0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
66f0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
6700: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
6710: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6720: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
6730: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
6740: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
6750: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
6760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6770: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6780: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
6790: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
67a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
67b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
67c0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
67d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
67e0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
67f0: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
6800: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
6810: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
6820: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
6830: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
6840: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
6850: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
6860: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
6870: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
6880: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
6890: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
68a0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
68b0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
68c0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
68d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
68e0: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
68f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
6900: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
6910: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
6920: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
6930: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
6940: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
6950: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
6960: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
6970: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
6980: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
6990: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
69a0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
69b0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
69c0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
69d0: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
69e0: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
69f0: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
6a00: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
6a10: 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34  OF: R-65033-2844
6a20: 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42  9 The built-in B
6a30: 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
6a40: 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74  compares.  ** st
6a50: 72 69 6e 67 73 20 62 79 74 65 20 62 79 20 62 79  rings byte by by
6a60: 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d  te using the mem
6a70: 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  cmp() function f
6a80: 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
6a90: 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e   C.  ** library.
6aa0: 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d   */.  rc = memcm
6ab0: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
6ac0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
6ad0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
6ae0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
6af0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
6b00: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
6b10: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
6b20: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
6b30: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
6b40: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
6b50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32  DENCE-OF: R-3162
6b60: 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20 69 73  4-24737 RTRIM is
6b70: 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63   like BINARY exc
6b80: 65 70 74 20 74 68 61 74 20 65 78 74 72 61 0a 20  ept that extra. 
6b90: 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61       ** spaces a
6ba0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74  t the end of eit
6bb0: 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f  her string do no
6bc0: 74 20 63 68 61 6e 67 65 20 74 68 65 20 72 65 73  t change the res
6bd0: 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20  ult. In other.  
6be0: 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74      ** words, st
6bf0: 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61  rings will compa
6c00: 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20  re equal to one 
6c10: 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20  another as long 
6c20: 61 73 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a  as they.      **
6c30: 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20   differ only in 
6c40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70  the number of sp
6c50: 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e  aces at the end.
6c60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
6c70: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
6c80: 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
6c90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6ca0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
6cb0: 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20  nother built-in 
6cc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
6cd0: 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a  ce: NOCASE. .**.
6ce0: 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e  ** This collatin
6cf0: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e  g sequence is in
6d00: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
6d10: 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65  d for "case inde
6d20: 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61  pendent.** compa
6d30: 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73  rison". SQLite's
6d40: 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70   knowledge of up
6d50: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61  per and lower ca
6d60: 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a  se equivalents.*
6d70: 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74  * extends only t
6d80: 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74  o the 26 charact
6d90: 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  ers used in the 
6da0: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
6db0: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d  ..**.** At the m
6dc0: 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f  oment there is o
6dd0: 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c  nly a UTF-8 impl
6de0: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
6df0: 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65  tatic int nocase
6e00: 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20  CollatingFunc(. 
6e10: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
6e20: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
6e30: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
6e40: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
6e50: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
6e60: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69  {.  int r = sqli
6e70: 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20  te3StrNICmp(.   
6e80: 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a     (const char *
6e90: 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63  )pKey1, (const c
6ea0: 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b  har *)pKey2, (nK
6eb0: 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31  ey1<nKey2)?nKey1
6ec0: 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45  :nKey2);.  UNUSE
6ed0: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
6ee0: 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72  sed);.  if( 0==r
6ef0: 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79   ){.    r = nKey
6f00: 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  1-nKey2;.  }.  r
6f10: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
6f20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
6f30: 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ID of the most r
6f40: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
6f50: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c  sqlite_int64 sql
6f60: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
6f70: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
6f80: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
6f90: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
6fa0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
6fb0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
6fc0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
6fd0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
6fe0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
6ff0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7000: 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52  return db->lastR
7010: 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  owid;.}../*.** R
7020: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
7030: 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74   of changes in t
7040: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
7050: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
7060: 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xec()..*/.int sq
7070: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71  lite3_changes(sq
7080: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
7090: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
70a0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
70b0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
70c0: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
70d0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
70e0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
70f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
7100: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
7110: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
7120: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7130: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
7140: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
7150: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
7160: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
7170: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
7180: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
7190: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
71a0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
71b0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
71c0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
71d0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
71e0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
71f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7200: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
7210: 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  urn db->nTotalCh
7220: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ange;.}../*.** C
7230: 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61  lose all open sa
7240: 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66  vepoints. This f
7250: 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e  unction only man
7260: 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20  ipulates fields 
7270: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
7280: 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  se handle object
7290: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c  , it does not cl
72a0: 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e  ose any savepoin
72b0: 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f  ts that may be o
72c0: 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d  pen.** at the b-
72d0: 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c  tree/pager level
72e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
72f0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
7300: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
7310: 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76   while( db->pSav
7320: 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61  epoint ){.    Sa
7330: 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20  vepoint *pTmp = 
7340: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
7350: 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69      db->pSavepoi
7360: 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74  nt = pTmp->pNext
7370: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7380: 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20  ree(db, pTmp);. 
7390: 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f   }.  db->nSavepo
73a0: 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  int = 0;.  db->n
73b0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
73c0: 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
73d0: 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  onSavepoint = 0;
73e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
73f0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
7400: 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  function associa
7410: 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65 66  ted with FuncDef
7420: 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65   p, if any. Exce
7430: 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  pt,.** if this i
7440: 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63  s not the last c
7450: 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74  opy of the funct
7460: 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f  ion, do not invo
7470: 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a  ke it. Multiple.
7480: 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73  ** copies of a s
7490: 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61  ingle function a
74a0: 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e 20  re created when 
74b0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
74c0: 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  ) is called.** w
74d0: 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61  ith SQLITE_ANY a
74e0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a  s the encoding..
74f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7500: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73  unctionDestroy(s
7510: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
7520: 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44  Def *p){.  FuncD
7530: 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74  estructor *pDest
7540: 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65 73  ructor = p->pDes
7550: 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70  tructor;.  if( p
7560: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
7570: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
7580: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
7590: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
75a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65  ==0 ){.      pDe
75b0: 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72  structor->xDestr
75c0: 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  oy(pDestructor->
75d0: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
75e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
75f0: 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  db, pDestructor)
7600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7610: 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20  *.** Disconnect 
7620: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  all sqlite3_vtab
7630: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65   objects that be
7640: 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  long to database
7650: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64   connection.** d
7660: 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  b. This is calle
7670: 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69  d when db is bei
7680: 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ng closed..*/.st
7690: 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e  atic void discon
76a0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69  nectAllVtab(sqli
76b0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65  te3 *db){.#ifnde
76c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
76d0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
76e0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   i;.  sqlite3Btr
76f0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
7700: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
7710: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
7720: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
7730: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  = db->aDb[i].pSc
7740: 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64 62  hema;.    if( db
7750: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
7760: 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45 6c   ){.      HashEl
7770: 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  em *p;.      for
7780: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
7790: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  st(&pSchema->tbl
77a0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
77b0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
77c0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
77d0: 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73  Tab = (Table *)s
77e0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
77f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  ;.        if( Is
7800: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
7810: 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f  sqlite3VtabDisco
7820: 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b  nnect(db, pTab);
7830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7840: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
7850: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
7860: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
7870: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73  aveAll(db);.#els
7880: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
7890: 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66  ETER(db);.#endif
78a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
78b0: 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61 73   TRUE if databas
78c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
78d0: 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  has unfinalized 
78e0: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
78f0: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
7900: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
7910: 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a  kup objects.  .*
7920: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
7930: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71  nectionIsBusy(sq
7940: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
7950: 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t j;.  assert( s
7960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7970: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
7980: 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20    if( db->pVdbe 
7990: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
79a0: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
79b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; j++){.    Btre
79c0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
79d0: 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [j].pBt;.    if(
79e0: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
79f0: 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70  treeIsInBackup(p
7a00: 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Bt) ) return 1;.
7a10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
7a30: 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74  n existing SQLit
7a40: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  e database.*/.st
7a50: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
7a60: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  Close(sqlite3 *d
7a70: 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62  b, int forceZomb
7a80: 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29  ie){.  if( !db )
7a90: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
7aa0: 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31  E-OF: R-63257-11
7ab0: 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69  740 Calling sqli
7ac0: 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20  te3_close() or. 
7ad0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c     ** sqlite3_cl
7ae0: 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61 20  ose_v2() with a 
7af0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67  NULL pointer arg
7b00: 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c  ument is a harml
7b10: 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  ess no-op. */.  
7b20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7b30: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  OK;.  }.  if( !s
7b40: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
7b50: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
7b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7b70: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7b80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
7b90: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7ba0: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63  tex);..  /* Forc
7bb0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61  e xDisconnect ca
7bc0: 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75  lls on all virtu
7bd0: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64  al tables */.  d
7be0: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
7bf0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  (db);..  /* If a
7c00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7c10: 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e  open, the discon
7c20: 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61  nectAllVtab() ca
7c30: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
7c40: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
7c50: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
7c60: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
7c70: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
7c80: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
7c90: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
7ca0: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
7cb0: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
7cc0: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
7cd0: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
7ce0: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
7cf0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
7d00: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
7d10: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
7d20: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
7d30: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
7d40: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
7d50: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
7d60: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
7d70: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
7d80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
7d90: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
7da0: 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76   /* Legacy behav
7db0: 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f  ior (sqlite3_clo
7dc0: 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69  se() behavior) i
7dd0: 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  s to return.  **
7de0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
7df0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
7e00: 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  an not be closed
7e10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
7e20: 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a  */.  if( !forceZ
7e30: 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74  ombie && connect
7e40: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
7e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7e60: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
7e70: 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c  ITE_BUSY, "unabl
7e80: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
7e90: 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a  o unfinalized ".
7ea0: 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e         "statemen
7eb0: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
7ec0: 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20   backups");.    
7ed0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7ee0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7ef0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7f00: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66  E_BUSY;.  }..#if
7f10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7f20: 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
7f30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
7f40: 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
7f50: 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65    /* Closing the
7f60: 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
7f70: 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
7f80: 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e  sed the value 2.
7f90: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47   */.    sqlite3G
7fa0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
7fb0: 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  log(sqlite3Globa
7fc0: 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
7fd0: 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20  rg, db, 0, 2);. 
7fe0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7ff0: 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e  Convert the conn
8000: 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f  ection into a zo
8010: 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c  mbie and then cl
8020: 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64  ose it..  */.  d
8030: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
8040: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a  E_MAGIC_ZOMBIE;.
8050: 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75    sqlite3LeaveMu
8060: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
8070: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
8080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8090: 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f  .** Two variatio
80a0: 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63  ns on the public
80b0: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63   interface for c
80c0: 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  losing a databas
80d0: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
80e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
80f0: 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74  se() version ret
8100: 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
8110: 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74   and.** leaves t
8120: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
8130: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
8140: 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  e unfinalized pr
8150: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
8160: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
8170: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
8180: 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ps.  The sqlite3
8190: 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76  _close_v2().** v
81a0: 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68  ersion forces th
81b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
81c0: 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20  become a zombie 
81d0: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
81e0: 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63  unclosed resourc
81f0: 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73  es, and arranges
8200: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f   for deallocatio
8210: 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a  n when the last.
8220: 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65  ** prepare state
8230: 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f  ment or sqlite3_
8240: 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a  backup closes..*
8250: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  /.int sqlite3_cl
8260: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ose(sqlite3 *db)
8270: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
8280: 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69  Close(db,0); }.i
8290: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
82a0: 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _v2(sqlite3 *db)
82b0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
82c0: 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a  Close(db,1); }..
82d0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
82e0: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
82f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
8300: 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d  ..**.** Furtherm
8310: 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65  ore, if database
8320: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
8330: 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e  s a zombie (mean
8340: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a  ing that there.*
8350: 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69  * has been a pri
8360: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
8370: 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20  e3_close(db) or 
8380: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8390: 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65  (db)) and.** eve
83a0: 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ry sqlite3_stmt 
83b0: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e  has now been fin
83c0: 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79  alized and every
83d0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
83e0: 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c  has.** finished,
83f0: 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72   then free all r
8400: 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69  esources..*/.voi
8410: 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75  d sqlite3LeaveMu
8420: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
8430: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
8440: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20    HashElem *i;  
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
8470: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  iterator */.  in
8480: 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t j;..  /* If th
8490: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
84a0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ing sqlite3_stmt
84b0: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
84c0: 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20  up objects.  ** 
84d0: 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  or if the connec
84e0: 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  tion has not yet
84f0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20   been closed by 
8500: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8510: 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75  (),.  ** then ju
8520: 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74  st leave the mut
8530: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ex and return.. 
8540: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
8550: 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic!=SQLITE_MAGI
8560: 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e  C_ZOMBIE || conn
8570: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29  ectionIsBusy(db)
8580: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8590: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
85a0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
85b0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rn;.  }..  /* If
85c0: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
85d0: 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
85e0: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
85f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a   connection has.
8600: 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20    ** closed all 
8610: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64  sqlite3_stmt and
8620: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8630: 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20  objects and has 
8640: 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64  been.  ** passed
8650: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
8660: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
8670: 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e  it is a zombie).
8680: 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a    Therefore,.  *
8690: 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66  * go ahead and f
86a0: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
86b0: 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  s..  */..  /* If
86c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
86d0: 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20  s open, roll it 
86e0: 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20  back. This also 
86f0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a  ensures that if.
8700: 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73    ** any databas
8710: 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62  e schemas have b
8720: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20  een modified by 
8730: 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74  an uncommitted t
8740: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
8750: 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20  they are reset. 
8760: 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71  And that the req
8770: 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  uired b-tree mut
8780: 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61  ex is held to ma
8790: 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ke.  ** the page
87a0: 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
87b0: 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61  chema reset an a
87c0: 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e  tomic operation.
87d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c   */.  sqlite3Rol
87e0: 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
87f0: 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46  ITE_OK);..  /* F
8800: 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  ree any outstand
8810: 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74  ing Savepoint st
8820: 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73  ructures. */.  s
8830: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
8840: 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  oints(db);..  /*
8850: 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62   Close all datab
8860: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
8870: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
8880: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
8890: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
88a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
88b0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
88c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
88d0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
88e0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44  ->pBt);.      pD
88f0: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
8900: 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20    if( j!=1 ){.  
8910: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
8920: 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ma = 0;.      }.
8930: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43      }.  }.  /* C
8940: 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73 63  lear the TEMP sc
8950: 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20  hema separately 
8960: 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66  and last */.  if
8970: 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
8980: 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69  hema ){.    sqli
8990: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64  te3SchemaClear(d
89a0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
89b0: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
89c0: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
89d0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  db);..  /* Free 
89e0: 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  up the array of 
89f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
8a00: 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ses */.  sqlite3
8a10: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
8a20: 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73  Array(db);.  ass
8a30: 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20  ert( db->nDb<=2 
8a40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
8a50: 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb==db->aDbSta
8a60: 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c  tic );..  /* Tel
8a70: 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f  l the code in no
8a80: 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20  tify.c that the 
8a90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f  connection no lo
8aa0: 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20  nger holds any. 
8ab0: 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f   ** locks and do
8ac0: 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
8ad0: 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63  ny further unloc
8ae0: 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
8af0: 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ks..  */.  sqlit
8b00: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73  e3ConnectionClos
8b10: 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a  ed(db);..  for(j
8b20: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
8b30: 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b  db->aFunc.a); j+
8b40: 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  +){.    FuncDef 
8b50: 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20  *pNext, *pHash, 
8b60: 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62  *p;.    for(p=db
8b70: 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b  ->aFunc.a[j]; p;
8b80: 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20   p=pHash){.     
8b90: 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73   pHash = p->pHas
8ba0: 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  h;.      while( 
8bb0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75 6e  p ){.        fun
8bc0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
8bd0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   p);.        pNe
8be0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
8bf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8c00: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
8c10: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
8c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8c30: 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  }.  for(i=sqlite
8c40: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
8c50: 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73  CollSeq); i; i=s
8c60: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
8c70: 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  ){.    CollSeq *
8c80: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
8c90: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
8ca0: 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76  a(i);.    /* Inv
8cb0: 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63 74  oke any destruct
8cc0: 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20 66  ors registered f
8cd0: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  or collation seq
8ce0: 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e  uence user data.
8cf0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
8d00: 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
8d10: 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78    if( pColl[j].x
8d20: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Del ){.        p
8d30: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f  Coll[j].xDel(pCo
8d40: 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20  ll[j].pUser);.  
8d50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8d60: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8d70: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , pColl);.  }.  
8d80: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
8d90: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
8da0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8db0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8dc0: 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  E.  for(i=sqlite
8dd0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
8de0: 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71  Module); i; i=sq
8df0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
8e00: 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d  {.    Module *pM
8e10: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73  od = (Module *)s
8e20: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
8e30: 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e  ;.    if( pMod->
8e40: 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  xDestroy ){.    
8e50: 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79    pMod->xDestroy
8e60: 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20  (pMod->pAux);.  
8e70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
8e80: 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b  bFree(db, pMod);
8e90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
8ea0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f  shClear(&db->aMo
8eb0: 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dule);.#endif.. 
8ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
8ed0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a  , SQLITE_OK); /*
8ee0: 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79   Deallocates any
8ef0: 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74   cached error st
8f00: 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  rings. */.  sqli
8f10: 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d  te3ValueFree(db-
8f20: 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  >pErr);.  sqlite
8f30: 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73  3CloseExtensions
8f40: 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  (db);.#if SQLITE
8f50: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
8f60: 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66  TION.  sqlite3_f
8f70: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
8f80: 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74  thUser);.  sqlit
8f90: 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68  e3_free(db->auth
8fa0: 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69  .zAuthPW);.#endi
8fb0: 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  f..  db->magic =
8fc0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
8fd0: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
8fe0: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
8ff0: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
9000: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
9010: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
9020: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
9030: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
9040: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
9050: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
9060: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
9070: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
9080: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
9090: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
90a0: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
90b0: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
90c0: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
90d0: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
90e0: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
90f0: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
9100: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
9110: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
9120: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
9130: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
9140: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9150: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9160: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
9170: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
9180: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
9190: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
91a0: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
91b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
91c0: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
91d0: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
91e0: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
91f0: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
9200: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
9210: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
9220: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
9230: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
9240: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
9250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
9260: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
9270: 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70   files.  If trip
9280: 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
9290: 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61  TE_OK, then.** a
92a0: 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ny write cursors
92b0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
92c0: 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73   ("tripped" - as
92d0: 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20   in "tripping a 
92e0: 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b  circuit.** break
92f0: 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f  er") and made to
9300: 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65   return tripCode
9310: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
9320: 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74  y further.** att
9330: 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61  empts to use tha
9340: 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64 20  t cursor.  Read 
9350: 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f  cursors remain o
9360: 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a  pen and valid.**
9370: 20 62 75 74 20 61 72 65 20 22 73 61 76 65 64 22   but are "saved"
9380: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 61 62   in case the tab
9390: 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76  le pages are mov
93a0: 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f  ed around..*/.vo
93b0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
93c0: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
93d0: 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  b, int tripCode)
93e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
93f0: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
9400: 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67 65  int schemaChange
9410: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9420: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
9430: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
9440: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
9450: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a  nMalloc();..  /*
9460: 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72   Obtain all b-tr
9470: 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72  ee mutexes befor
9480: 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c  e making any cal
9490: 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62  ls to BtreeRollb
94a0: 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69  ack(). .  ** Thi
94b0: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
94c0: 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
94d0: 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c  action being rol
94e0: 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a  led back has.  *
94f0: 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  * modified the d
9500: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
9510: 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  If the b-tree mu
9520: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61  texes are not ta
9530: 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74  ken.  ** here, t
9540: 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72  hen another shar
9550: 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74  ed-cache connect
9560: 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  ion might sneak 
9570: 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  in between.  ** 
9580: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c  the database rol
9590: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
95a0: 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61   reset, which ca
95b0: 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20  n cause false.  
95c0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65  ** corruption re
95d0: 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61  ports in some ca
95e0: 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ses.  */.  sqlit
95f0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
9600: 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68 61  db);.  schemaCha
9610: 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  nge = (db->flags
9620: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
9630: 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64  Changes)!=0 && d
9640: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b  b->init.busy==0;
9650: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
9660: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
9670: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
9680: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
9690: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
96a0: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
96b0: 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a  IsInTrans(p) ){.
96c0: 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20          inTrans 
96d0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
96e0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
96f0: 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43  ollback(p, tripC
9700: 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e  ode, !schemaChan
9710: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
9720: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
9730: 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69  back(db);.  sqli
9740: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
9750: 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64 62  oc();..  if( (db
9760: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
9770: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30  nternChanges)!=0
9780: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
9790: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
97a0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
97b0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
97c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
97d0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
97e0: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
97f0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
9800: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
9810: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
9820: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
9830: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
9840: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
9850: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
9860: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
9870: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
9880: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
9890: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
98a0: 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  erFKs;..  /* If 
98b0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
98c0: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
98d0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
98e0: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
98f0: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
9900: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
9910: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
9920: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
9930: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
9940: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
9950: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
9960: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9970: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f  static string co
9980: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
9990: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
99a0: 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  to the error cod
99b0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69  e.** specified i
99c0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
99d0: 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28  */.#if (defined(
99e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
99f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 29 20   SQLITE_OS_WIN) 
9a00: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
9a10: 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20 63 68  E_TEST).const ch
9a20: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
9a30: 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f  me(int rc){.  co
9a40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
9a50: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72  = 0;.  int i, or
9a60: 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72  igRc = rc;.  for
9a70: 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61  (i=0; i<2 && zNa
9a80: 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26  me==0; i++, rc &
9a90: 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69  = 0xff){.    swi
9aa0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20  tch( rc ){.     
9ab0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ae0: 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20  _OK";           
9af0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9b00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
9b10: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
9b20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9b30: 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20  E_ERROR";       
9b40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9b50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
9b60: 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20  NTERNAL:        
9b70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9b80: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
9b90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9ba0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9bb0: 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20  PERM:           
9bc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9bd0: 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20  ITE_PERM";      
9be0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9bf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9c00: 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20  _ABORT:         
9c10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9c20: 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20  LITE_ABORT";    
9c30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9c40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9c50: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
9c60: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
9c70: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
9c80: 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b  BACK";    break;
9c90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9ca0: 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20  TE_BUSY:        
9cb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9cc0: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9ce0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9cf0: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
9d00: 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  Y:      zName = 
9d10: 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43  "SQLITE_BUSY_REC
9d20: 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72 65 61  OVERY";     brea
9d30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d40: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
9d50: 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  OT:      zName =
9d60: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e   "SQLITE_BUSY_SN
9d70: 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65  APSHOT";     bre
9d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9d90: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
9da0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9db0: 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  = "SQLITE_LOCKED
9dc0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9dd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9de0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
9df0: 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65  AREDCACHE: zName
9e00: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
9e10: 44 5f 53 48 41 52 45 44 43 41 43 48 45 22 3b 62  D_SHAREDCACHE";b
9e20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9e30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20   SQLITE_NOMEM:  
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9e50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  e = "SQLITE_NOME
9e60: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
9e70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9e80: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
9e90: 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  Y:           zNa
9ea0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
9eb0: 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20  DONLY";         
9ec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9ed0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
9ee0: 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e  LY_RECOVERY:  zN
9ef0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
9f00: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22  ADONLY_RECOVERY"
9f10: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9f20: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
9f30: 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a  NLY_CANTLOCK:  z
9f40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
9f50: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
9f60: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
9f70: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
9f80: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  ONLY_ROLLBACK:  
9f90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9fa0: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
9fb0: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
9fc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
9fd0: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20  DONLY_DBMOVED:  
9fe0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ff0: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
a000: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
a010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
a020: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
a030: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a040: 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20  E_INTERRUPT";   
a050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a060: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a070: 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20  OERR:           
a080: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a090: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
a0a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a0b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a0c0: 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20  IOERR_READ:     
a0d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a0e0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b  ITE_IOERR_READ";
a0f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a100: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a110: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
a120: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
a130: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
a140: 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a  _READ";  break;.
a150: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a160: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20  E_IOERR_WRITE:  
a170: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a180: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
a190: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
a1a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a1b0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20  TE_IOERR_FSYNC: 
a1c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a1d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
a1e0: 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  NC";       break
a1f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a200: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
a210: 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  YNC:    zName = 
a220: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
a230: 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61  R_FSYNC";   brea
a240: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a250: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
a260: 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATE:     zName =
a270: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54   "SQLITE_IOERR_T
a280: 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65  RUNCATE";    bre
a290: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a2a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
a2b0: 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  T:        zName 
a2c0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a2d0: 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72  FSTAT";       br
a2e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a2f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
a300: 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  OCK:       zName
a310: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a320: 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62  _UNLOCK";      b
a330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a340: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
a350: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
a360: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a370: 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_RDLOCK";      
a380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a390: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
a3a0: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61  ELETE:       zNa
a3b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a3c0: 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20  RR_DELETE";     
a3d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a3e0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a3f0: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e  NOMEM:        zN
a400: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a410: 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ERR_NOMEM";     
a420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a430: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a440: 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a  _ACCESS:       z
a450: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a460: 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20  OERR_ACCESS";   
a470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a480: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a490: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
a4a0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OCK:.           
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a4d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
a4e0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62  RESERVEDLOCK"; b
a4f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
a510: 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  CK:         zNam
a520: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a530: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
a540: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a550: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
a560: 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  LOSE:        zNa
a570: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a580: 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20  RR_CLOSE";      
a590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a5a0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a5b0: 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e  DIR_CLOSE:    zN
a5c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a5d0: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20  ERR_DIR_CLOSE"; 
a5e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a5f0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a600: 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a  _SHMOPEN:      z
a610: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a620: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20  OERR_SHMOPEN";  
a630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a640: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a650: 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20  R_SHMSIZE:      
a660: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a670: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20  IOERR_SHMSIZE"; 
a680: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a690: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a6a0: 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20  RR_SHMLOCK:     
a6b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a6c0: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b  _IOERR_SHMLOCK";
a6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a6e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a6f0: 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20  ERR_SHMMAP:     
a700: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a710: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b  E_IOERR_SHMMAP";
a720: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a730: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a740: 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20  OERR_SEEK:      
a750: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a760: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20  TE_IOERR_SEEK"; 
a770: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a780: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a790: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
a7a0: 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  NT: zName = "SQL
a7b0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
a7c0: 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20  _NOENT";break;. 
a7d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a7e0: 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20  _IOERR_MMAP:    
a7f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a800: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22  LITE_IOERR_MMAP"
a810: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
a820: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a830: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
a840: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
a850: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
a860: 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  EMPPATH"; break;
a870: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a880: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
a890: 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  H:     zName = "
a8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
a8b0: 56 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b  VPATH";    break
a8c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a8d0: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
a8e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a8f0: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22  "SQLITE_CORRUPT"
a900: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
a910: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a920: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
a930: 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  B:       zName =
a940: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
a950: 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65  _VTAB";      bre
a960: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a970: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
a980: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a990: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  = "SQLITE_NOTFOU
a9a0: 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  ND";          br
a9b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a9c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20  SQLITE_FULL:    
a9d0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a9e0: 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22   = "SQLITE_FULL"
a9f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
aa00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa10: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
aa20: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
aa30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
aa40: 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20  OPEN";          
aa50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aa60: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
aa70: 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61  N_NOTEMPDIR: zNa
aa80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
aa90: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22  TOPEN_NOTEMPDIR"
aaa0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
aab0: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
aac0: 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e  EN_ISDIR:     zN
aad0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
aae0: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20  NTOPEN_ISDIR";  
aaf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ab00: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
ab10: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a  PEN_FULLPATH:  z
ab20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
ab30: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
ab40: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
ab50: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
ab60: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OPEN_CONVPATH:  
ab70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab80: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
ab90: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
aba0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
abb0: 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20  TOCOL:          
abc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
abd0: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20  _PROTOCOL";     
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
abf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
ac00: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
ac10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac20: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
ac30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
ac50: 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20  CHEMA:          
ac60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ac70: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
ac80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ac90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
aca0: 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20  TOOBIG:         
acb0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
acc0: 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20  ITE_TOOBIG";    
acd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ace0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
acf0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20  _CONSTRAINT:    
ad00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ad10: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
ad20: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
ad30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad40: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
ad50: 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  QUE:  zName = "S
ad60: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
ad70: 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b  _UNIQUE"; break;
ad80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad90: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
ada0: 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  IGGER: zName = "
adb0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
adc0: 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b  T_TRIGGER";break
add0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ade0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
adf0: 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20  OREIGNKEY:.     
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ae20: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
ae30: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
ae40: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
ae50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
ae60: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20  NSTRAINT_CHECK: 
ae70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ae80: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
ae90: 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CK";  break;.   
aea0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
aeb0: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
aec0: 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  YKEY:.          
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
aef0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
af00: 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20  _PRIMARYKEY";   
af10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
af30: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61  INT_NOTNULL: zNa
af40: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
af50: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22  STRAINT_NOTNULL"
af60: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
af70: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
af80: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a  AINT_COMMITHOOK:
af90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
afc0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
afd0: 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b  ITHOOK";   break
afe0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aff0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
b000: 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TAB:    zName = 
b010: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b020: 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61  NT_VTAB";   brea
b030: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b040: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b050: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b080: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b090: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20  AINT_FUNCTION"; 
b0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b0b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b0c0: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20  STRAINT_ROWID:  
b0d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b0e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
b0f0: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
b100: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
b110: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
b120: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b130: 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20  E_MISMATCH";    
b140: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b150: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
b160: 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20  ISUSE:          
b170: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b180: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
b190: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b1a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1b0: 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20  NOLFS:          
b1c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b1d0: 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20  ITE_NOLFS";     
b1e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b1f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b200: 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20  _AUTH:          
b210: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b220: 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20  LITE_AUTH";     
b230: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b240: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b250: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20  E_FORMAT:       
b260: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b270: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20  QLITE_FORMAT";  
b280: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b290: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2a0: 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20  TE_RANGE:       
b2b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b2c0: 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20  SQLITE_RANGE";  
b2d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b2e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b2f0: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
b300: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b310: 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b  "SQLITE_NOTADB";
b320: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b330: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b340: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
b350: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b360: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20   "SQLITE_ROW";  
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b380: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b390: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20  QLITE_NOTICE:   
b3a0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b3b0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
b3c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b3d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b3e0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
b3f0: 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65  COVER_WAL: zName
b400: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
b410: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62  E_RECOVER_WAL";b
b420: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b430: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
b440: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a  ECOVER_ROLLBACK:
b450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b480: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
b490: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
b4a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b4b0: 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20  ITE_WARNING:    
b4c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b4d0: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22  "SQLITE_WARNING"
b4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
b4f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b500: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
b510: 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d  OINDEX:  zName =
b520: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
b530: 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65  _AUTOINDEX"; bre
b540: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b550: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
b560: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b570: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b  = "SQLITE_DONE";
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
b590: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
b5a0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
b5b0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
b5c0: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
b5d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b5e0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
b5f0: 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e  uf, "SQLITE_UNKN
b600: 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63  OWN(%d)", origRc
b610: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a  );.    zName = z
b620: 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Buf;.  }.  retur
b630: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
b640: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
b650: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
b660: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
b670: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
b680: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
b690: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
b6a0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
b6b0: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
b6c0: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
b6d0: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
b6e0: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
b6f0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
b700: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
b710: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
b720: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
b730: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
b740: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
b750: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
b760: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
b770: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
b780: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
b790: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
b7a0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
b7b0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
b7c0: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
b7d0: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
b7e0: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
b7f0: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
b800: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
b810: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
b820: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
b830: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
b840: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
b850: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
b860: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
b870: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
b880: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
b890: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
b8a0: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
b8b0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
b8c0: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
b8d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
b8e0: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
b8f0: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
b900: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
b910: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
b920: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
b930: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
b940: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
b950: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
b960: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
b970: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
b980: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
b990: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
b9a0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
b9b0: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
b9c0: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
b9d0: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
b9e0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
b9f0: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
ba00: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
ba10: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
ba20: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
ba30: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
ba40: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
ba50: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
ba60: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
ba70: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
ba80: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
ba90: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
baa0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
bab0: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
bac0: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
bad0: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
bae0: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
baf0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
bb00: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
bb10: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
bb20: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
bb30: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
bb40: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
bb50: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
bb60: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
bb70: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
bb80: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
bb90: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
bba0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
bbb0: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
bbc0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
bbd0: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
bbe0: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
bbf0: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
bc00: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
bc10: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
bc20: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
bc30: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
bc40: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
bc50: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
bc60: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
bc70: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
bc80: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
bc90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bca0: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
bcb0: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
bcc0: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
bcd0: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
bce0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
bcf0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
bd00: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
bd10: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
bd20: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
bd30: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
bd40: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
bd50: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
bd60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bd70: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
bd80: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
bd90: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
bda0: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
bdb0: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
bdc0: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
bdd0: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
bde0: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
bdf0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
be00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
be10: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
be20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
be30: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
be40: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
be50: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
be60: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
be70: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
be80: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
be90: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
bea0: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
beb0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
bec0: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
bed0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
bee0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
bef0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
bf00: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
bf10: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bf30: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
bf40: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
bf70: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
bf80: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
bf90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
bfa0: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
bfb0: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
bfc0: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
bfd0: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
bfe0: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
bff0: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
c000: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
c010: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
c020: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
c030: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
c040: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
c050: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
c060: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
c070: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
c080: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
c090: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
c0a0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
c0b0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
c0c0: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
c0d0: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
c0e0: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
c0f0: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
c100: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
c110: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
c120: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
c130: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
c140: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
c150: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
c160: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
c170: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
c180: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
c190: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
c1a0: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
c1b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
c1c0: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
c1d0: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
c1e0: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
c1f0: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
c200: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
c210: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
c220: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
c230: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
c240: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
c250: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
c260: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
c270: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
c280: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
c290: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
c2a0: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
c2b0: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
c2c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c2d0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
c2e0: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
c2f0: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
c300: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
c310: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
c320: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
c330: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
c350: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
c360: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
c370: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
c380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
c390: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
c3a0: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
c3b0: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
c3c0: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
c3d0: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
c3e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
c3f0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
c400: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
c410: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
c420: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
c430: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
c440: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
c450: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
c460: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
c470: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
c480: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
c490: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
c4a0: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
c4b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
c4c0: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
c4d0: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
c4e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c4f0: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
c500: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
c510: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
c520: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
c530: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
c540: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
c550: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
c560: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
c570: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
c580: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
c590: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
c5a0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
c5b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c5c0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
c5d0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
c5e0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
c5f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c600: 4d 49 53 55 53 45 3b 0a 23 65 6e 64 69 66 0a 20  MISUSE;.#endif. 
c610: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
c620: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
c630: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
c640: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
c650: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
c660: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
c670: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
c680: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
c690: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
c6a0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
c6b0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
c6c0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
c6d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
c6e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c6f0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
c700: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
c710: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
c720: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
c730: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
c740: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
c750: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
c760: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
c770: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
c780: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
c790: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
c7a0: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
c7b0: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
c7c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c7d0: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
c7e0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
c7f0: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
c800: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
c810: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
c820: 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65  d *pArg.){.#ifde
c830: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c840: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
c850: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
c860: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
c870: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
c880: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
c890: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
c8a0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
c8b0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
c8c0: 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30  x);.  if( nOps>0
c8d0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f   ){.    db->xPro
c8e0: 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73  gress = xProgres
c8f0: 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  s;.    db->nProg
c900: 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67  ressOps = (unsig
c910: 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62  ned)nOps;.    db
c920: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
c930: 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   pArg;.  }else{.
c940: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
c950: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  s = 0;.    db->n
c960: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b  ProgressOps = 0;
c970: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
c980: 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  ssArg = 0;.  }. 
c990: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c9a0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
c9b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
c9c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c9d0: 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c  nstalls a defaul
c9e0: 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74  t busy handler t
c9f0: 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68  hat waits for th
ca00: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e  e.** specified n
ca10: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
ca20: 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74  conds before ret
ca30: 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74  urning 0..*/.int
ca40: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
ca50: 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64  meout(sqlite3 *d
ca60: 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64  b, int ms){.#ifd
ca70: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ca80: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
ca90: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
caa0: 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
cab0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
cac0: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
cad0: 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20   if( ms>0 ){.   
cae0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
caf0: 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65  ndler(db, sqlite
cb00: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
cb10: 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b  ack, (void*)db);
cb20: 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d  .    db->busyTim
cb30: 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c  eout = ms;.  }el
cb40: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
cb50: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
cb60: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
cb70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cb80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61  }../*.** Cause a
cb90: 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61  ny pending opera
cba0: 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20  tion to stop at 
cbb0: 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70  its earliest opp
cbc0: 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69  ortunity..*/.voi
cbd0: 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  d sqlite3_interr
cbe0: 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  upt(sqlite3 *db)
cbf0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
cc00: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
cc10: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
cc20: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
cc30: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
cc40: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
cc50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
cc60: 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75  }.#endif.  db->u
cc70: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
cc80: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
cc90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
cca0: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
ccb0: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
ccc0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
ccd0: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
cce0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
ccf0: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
cd00: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
cd10: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
cd20: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
cd30: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
cd40: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
cd50: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
cd60: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
cd70: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
cd80: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
cd90: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
cda0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
cdb0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
cdc0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
cdd0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
cde0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
cdf0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
ce00: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
ce10: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
ce20: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
ce30: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
ce40: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
ce50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ce60: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
ce70: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
ce80: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
ce90: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
cea0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
ceb0: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
cec0: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
ced0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65  t nName;.  int e
cee0: 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73  xtraFlags;..  as
cef0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cf00: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
cf10: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75  ex) );.  if( zFu
cf20: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c  nctionName==0 ||
cf30: 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26 26  .      (xFunc &&
cf40: 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65   (xFinal || xSte
cf50: 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21  p)) || .      (!
cf60: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
cf70: 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a   && !xStep)) ||.
cf80: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
cf90: 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74   (!xFinal && xSt
cfa0: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e  ep)) ||.      (n
cfb0: 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53  Arg<-1 || nArg>S
cfc0: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
cfd0: 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20  ON_ARG) ||.     
cfe0: 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73   (255<(nName = s
cff0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20  qlite3Strlen30( 
d000: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29  zFunctionName)))
d010: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d020: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d030: 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  T;.  }..  assert
d040: 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  ( SQLITE_FUNC_CO
d050: 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44  NSTANT==SQLITE_D
d060: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
d070: 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65    extraFlags = e
d080: 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54  nc &  SQLITE_DET
d090: 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e  ERMINISTIC;.  en
d0a0: 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e  c &= (SQLITE_FUN
d0b0: 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45  C_ENCMASK|SQLITE
d0c0: 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65  _ANY);.  .#ifnde
d0d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
d0e0: 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  F16.  /* If SQLI
d0f0: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
d100: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
d110: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
d120: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
d130: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
d140: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
d150: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
d160: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
d170: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
d180: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
d190: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
d1a0: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ernally..  **.  
d1b0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59  ** If SQLITE_ANY
d1c0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61   is specified, a
d1d0: 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e  dd three version
d1e0: 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  s of the functio
d1f0: 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61  n.  ** to the ha
d200: 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  sh table..  */. 
d210: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
d220: 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e  _UTF16 ){.    en
d230: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
d240: 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20  NATIVE;.  }else 
d250: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
d260: 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ANY ){.    int r
d270: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
d280: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
d290: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
d2a0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
d2b0: 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  F8|extraFlags,. 
d2c0: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
d2d0: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
d2e0: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
d2f0: 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ctor);.    if( r
d300: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d310: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d320: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
d330: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
d340: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
d350: 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c  16LE|extraFlags,
d360: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
d370: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
d380: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
d390: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
d3a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d3b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
d3c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
d3d0: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
d3e0: 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65  _UTF16BE;.  }.#e
d3f0: 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49  lse.  enc = SQLI
d400: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
d410: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
d420: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e   an existing fun
d430: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f  ction is being o
d440: 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c  verridden or del
d450: 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a  eted. If so,.  *
d460: 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
d470: 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e  active VMs, then
d480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
d490: 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69  USY. If a functi
d4a0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  on.  ** is being
d4b0: 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65   overridden/dele
d4c0: 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72  ted but there ar
d4d0: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
d4e0: 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20   allow the.  ** 
d4f0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  operation to con
d500: 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69  tinue but invali
d510: 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70  date all precomp
d520: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
d530: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
d540: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
d550: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
d560: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
d570: 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69  (u8)enc, 0);.  i
d580: 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63  f( p && (p->func
d590: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
d5a0: 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e  UNC_ENCMASK)==en
d5b0: 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41  c && p->nArg==nA
d5c0: 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  rg ){.    if( db
d5d0: 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
d5e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
d5f0: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
d600: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
d610: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
d620: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73  delete/modify us
d630: 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20  er-function due 
d640: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
d650: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73  ents");.      as
d660: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
d670: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
d680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
d690: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
d6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d6b0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
d6c0: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d  ments(db);.    }
d6d0: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
d6e0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
d6f0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
d700: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
d710: 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61  (u8)enc, 1);.  a
d720: 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d  ssert(p || db->m
d730: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20  allocFailed);.  
d740: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
d750: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d760: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  M;.  }..  /* If 
d770: 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  an older version
d780: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
d790: 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72   with a configur
d7a0: 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  ed destructor is
d7b0: 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c  .  ** being repl
d7c0: 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20  aced invoke the 
d7d0: 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  destructor funct
d7e0: 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66  ion here. */.  f
d7f0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
d800: 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44  b, p);..  if( pD
d810: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
d820: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
d830: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ef++;.  }.  p->p
d840: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65  Destructor = pDe
d850: 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66  structor;.  p->f
d860: 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66  uncFlags = (p->f
d870: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
d880: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20  E_FUNC_ENCMASK) 
d890: 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20  | extraFlags;.  
d8a0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e  testcase( p->fun
d8b0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
d8c0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
d8d0: 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46  .  p->xFunc = xF
d8e0: 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20  unc;.  p->xStep 
d8f0: 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46  = xStep;.  p->xF
d900: 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c  inalize = xFinal
d910: 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61  ;.  p->pUserData
d920: 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20   = pUserData;.  
d930: 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e  p->nArg = (u16)n
d940: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
d950: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d960: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
d970: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
d980: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
d990: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
d9a0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
d9b0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
d9c0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
d9d0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
d9e0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
d9f0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
da00: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
da10: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
da20: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
da30: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
da40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
da50: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
da60: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
da70: 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  ext*).){.  retur
da80: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
da90: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c  _function_v2(db,
daa0: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
dab0: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
dac0: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
daf0: 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  0);.}..int sqlit
db00: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
db10: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
db20: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
db30: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
db40: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
db50: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
db60: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
db70: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
db80: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
db90: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
dba0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
dbb0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
dbc0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
dbd0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
dbe0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
dbf0: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
dc00: 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20  oy)(void *).){. 
dc10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dc20: 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65  _ERROR;.  FuncDe
dc30: 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d  structor *pArg =
dc40: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
dc50: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
dc60: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
dc70: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
dc80: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
dc90: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
dca0: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
dcb0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
dcc0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
dcd0: 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f  );.  if( xDestro
dce0: 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20  y ){.    pArg = 
dcf0: 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20  (FuncDestructor 
dd00: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
dd10: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
dd20: 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29  (FuncDestructor)
dd30: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72 67  );.    if( !pArg
dd40: 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72   ){.      xDestr
dd50: 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74  oy(p);.      got
dd60: 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  o out;.    }.   
dd70: 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20   pArg->xDestroy 
dd80: 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20  = xDestroy;.    
dd90: 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20  pArg->pUserData 
dda0: 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = p;.  }.  rc = 
ddb0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
ddc0: 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  c(db, zFunc, nAr
ddd0: 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63  g, enc, p, xFunc
dde0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
ddf0: 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41   pArg);.  if( pA
de00: 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66  rg && pArg->nRef
de10: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
de20: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
de30: 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79   );.    xDestroy
de40: 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
de50: 44 62 46 72 65 65 28 64 62 2c 20 70 41 72 67 29  DbFree(db, pArg)
de60: 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72  ;.  }.. out:.  r
de70: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
de80: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
de90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
dea0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
deb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
dec0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ded0: 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69  T_UTF16.int sqli
dee0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
def0: 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
df00: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f   *db,.  const vo
df10: 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  id *zFunctionNam
df20: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
df30: 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
df40: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
df50: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
df60: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
df70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
df80: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
df90: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
dfa0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
dfb0: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
dfc0: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
dfd0: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
dfe0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
dff0: 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20  zFunc8;..#ifdef 
e000: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e010: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
e020: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
e030: 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63  kOk(db) || zFunc
e040: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65  tionName==0 ) re
e050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
e060: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
e070: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e080: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
e090: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
e0a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e0b0: 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69  .  zFunc8 = sqli
e0c0: 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
e0d0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d  zFunctionName, -
e0e0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
e0f0: 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73  ATIVE);.  rc = s
e100: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
e110: 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72  (db, zFunc8, nAr
e120: 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20  g, eTextRep, p, 
e130: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
e140: 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74  inal,0);.  sqlit
e150: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75  e3DbFree(db, zFu
e160: 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nc8);.  rc = sql
e170: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
e180: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
e190: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e1a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e1b0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  rc;.}.#endif.../
e1c0: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61  *.** Declare tha
e1d0: 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  t a function has
e1e0: 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64   been overloaded
e1f0: 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61   by a virtual ta
e200: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
e210: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61  e function alrea
e220: 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72  dy exists as a r
e230: 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75  egular global fu
e240: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20  nction, then.** 
e250: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e260: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65  a no-op.  If the
e270: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
e280: 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63  ot exist, then c
e290: 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f  reate.** a new o
e2a0: 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74  ne that always t
e2b0: 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65  hrows a run-time
e2c0: 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20   error.  .**.** 
e2d0: 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62  When virtual tab
e2e0: 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72  les intend to pr
e2f0: 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61  ovide an overloa
e300: 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  ded function, th
e310: 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c  ey.** should cal
e320: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  l this routine t
e330: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
e340: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
e350: 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f  exists..** A glo
e360: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  bal function mus
e370: 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72  t exist in order
e380: 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
e390: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20  tion to work.** 
e3a0: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74  properly..*/.int
e3b0: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
e3c0: 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  d_function(.  sq
e3d0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
e3e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
e3f0: 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20    int nArg.){.  
e400: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  int nName = sqli
e410: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
e420: 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e);.  int rc = S
e430: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
e440: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e450: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
e460: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
e470: 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
e480: 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32  me==0 || nArg<-2
e490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e4a0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e4b0: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
e4c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e4d0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e4e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
e4f0: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
e500: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
e510: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
e520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
e530: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
e540: 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  nc(db, zName, nA
e550: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
e560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e570: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
e580: 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
e590: 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  ction, 0, 0, 0);
e5a0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
e5b0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
e5c0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
e5d0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
e5e0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
e5f0: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
e600: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
e610: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
e620: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e   trace function.
e630: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
e640: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
e650: 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a  egistered trace.
e660: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
e670: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74   .**.** A NULL t
e680: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  race function me
e690: 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63  ans that no trac
e6a0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
e6b0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
e6c0: 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74  trace is a point
e6d0: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
e6e0: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
e6f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
e700: 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61   each.** SQL sta
e710: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
e720: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
e730: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
e740: 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a   (*xTrace)(void*
e750: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
e760: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
e770: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
e780: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e790: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
e7a0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
e7b0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
e7c0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
e7d0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
e7e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
e7f0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
e800: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e810: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
e820: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
e830: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
e840: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
e850: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
e860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e870: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
e880: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
e890: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
e8a0: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
e8b0: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
e8c0: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
e8d0: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
e8e0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
e8f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
e900: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
e910: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
e920: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
e930: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
e940: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
e950: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
e960: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
e970: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
e980: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
e990: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
e9a0: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
e9b0: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
e9c0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
e9d0: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
e9e0: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
e9f0: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
ea00: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
ea10: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
ea20: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
ea30: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
ea40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
ea50: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
ea60: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
ea70: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
ea80: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
ea90: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
eaa0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
eab0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
eac0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ead0: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
eae0: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20  ->pProfileArg;. 
eaf0: 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20   db->xProfile = 
eb00: 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e  xProfile;.  db->
eb10: 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41  pProfileArg = pA
eb20: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
eb30: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
eb40: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
eb50: 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
eb60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
eb70: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  CE */../*.** Reg
eb80: 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e  ister a function
eb90: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77   to be invoked w
eba0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
ebb0: 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66  n commits..** If
ebc0: 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e   the invoked fun
ebd0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
ebe0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
ebf0: 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20   commit becomes 
ec00: 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  a.** rollback..*
ec10: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
ec20: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73  commit_hook(.  s
ec30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
ec40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
ec50: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
ec60: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
ec70: 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
ec80: 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46  k)(void*),  /* F
ec90: 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b  unction to invok
eca0: 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74  e on each commit
ecb0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
ece0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
ecf0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
ed00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ed10: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
ed20: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
ed30: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
ed40: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
ed50: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
ed60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ed70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
ed80: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ed90: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
eda0: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
edb0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
edc0: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
edd0: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
ede0: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
edf0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ee00: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
ee10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
ee20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
ee30: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
ee40: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
ee50: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
ee60: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
ee70: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
ee80: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
ee90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
eea0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
eeb0: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  _update_hook(.  
eec0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
eed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
eee0: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
eef0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
ef00: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
ef10: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
ef20: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72  har const *,char
ef30: 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f   const *,sqlite_
ef40: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
ef50: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
ef60: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
ef70: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
ef80: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
ef90: 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
efa0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
efb0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
efc0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
efd0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
efe0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
eff0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
f000: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
f010: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f020: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f030: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
f040: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
f050: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
f060: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
f070: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
f080: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
f090: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f0a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f0b0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
f0c0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
f0d0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
f0e0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
f0f0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
f100: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
f110: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
f120: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
f130: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
f140: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
f150: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
f160: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
f170: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
f180: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
f190: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
f1a0: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
f1b0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
f1c0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
f1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
f1e0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
f1f0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
f200: 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64  oid *pRet;..#ifd
f210: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f220: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
f230: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f240: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
f250: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
f260: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
f270: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
f280: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f290: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f2a0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
f2b0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
f2c0: 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  ;.  db->xRollbac
f2d0: 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  kCallback = xCal
f2e0: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f  lback;.  db->pRo
f2f0: 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67  llbackArg = pArg
f300: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f310: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f320: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
f330: 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  t;.}..#ifdef SQL
f340: 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
f350: 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20  DATE_HOOK./*.** 
f360: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
f370: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
f380: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
f390: 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
f3a0: 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
f3b0: 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
f3c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f3d0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
f3e0: 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
f3f0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
f400: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
f410: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
f420: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
f430: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28  abase */.  void(
f440: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20  *xCallback)(    
f450: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b       /* Callback
f460: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
f470: 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c   void*,sqlite3*,
f480: 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c  int,char const*,
f490: 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69  char const*,sqli
f4a0: 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65  te3_int64,sqlite
f4b0: 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  3_int64),.  void
f4c0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
f4d0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
f4e0: 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
f4f0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
f500: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
f510: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f520: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
f530: 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
f540: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64  g;.  db->xPreUpd
f550: 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
f560: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
f570: 50 72 65 55 70 64 61 74 65 41 72 67 20 3d 20 70  PreUpdateArg = p
f580: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
f590: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f5a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f5b0: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
f5c0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
f5d0: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
f5e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
f5f0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
f600: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
f610: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
f620: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
f630: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
f640: 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
f650: 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
f660: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
f670: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
f680: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
f690: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
f6a0: 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
f6b0: 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
f6c0: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
f6d0: 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
f6e0: 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
f6f0: 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
f700: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
f710: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
f720: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
f730: 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
f740: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
f750: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
f760: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
f770: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
f780: 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
f790: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
f7a0: 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
f7b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
f7c0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
f7d0: 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
f7e0: 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
f7f0: 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
f800: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
f810: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
f820: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
f830: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
f840: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
f850: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
f860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f870: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f880: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
f890: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
f8a0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
f8b0: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
f8c0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
f8d0: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
f8e0: 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
f8f0: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
f900: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
f910: 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
f920: 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
f930: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
f940: 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
f950: 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
f960: 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
f970: 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
f980: 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
f990: 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
f9a0: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
f9b0: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
f9c0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
f9d0: 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
f9e0: 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
f9f0: 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
fa00: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
fa10: 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
fa20: 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
fa30: 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
fa40: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
fa50: 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
fa60: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
fa70: 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
fa80: 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
fa90: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
faa0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
fab0: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
fac0: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
fad0: 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
fae0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
faf0: 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
fb00: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
fb10: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fb20: 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
fb30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fb40: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
fb50: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
fb60: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
fb70: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fb80: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
fb90: 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  dif.  if( nFrame
fba0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
fbb0: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73  3_wal_hook(db, s
fbc0: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
fbd0: 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54  Hook, SQLITE_INT
fbe0: 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29  _TO_PTR(nFrame))
fbf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
fc00: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
fc10: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  db, 0, 0);.  }.#
fc20: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
fc30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fc40: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
fc50: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
fc60: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
fc70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
fc80: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
fc90: 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d  the write-ahead-
fca0: 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61  log by this data
fcb0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
fcc0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
fcd0: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71  3_wal_hook(.  sq
fce0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd00: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
fd10: 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64   to this db hand
fd20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61  le */.  int(*xCa
fd30: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20  llback)(void *, 
fd40: 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20  sqlite3*, const 
fd50: 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76  char*, int),.  v
fd60: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd80: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
fd90: 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c   passed to xCall
fda0: 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66  back() */.){.#if
fdb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fdc0: 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65  _WAL.  void *pRe
fdd0: 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
fde0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
fdf0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
fe00: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
fe10: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
fe20: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
fe30: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
fe40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
fe50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fe60: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
fe70: 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41  pRet = db->pWalA
fe80: 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61  rg;.  db->xWalCa
fe90: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
fea0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72  ck;.  db->pWalAr
feb0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
fec0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fed0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
fee0: 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65  turn pRet;.#else
fef0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
ff00: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  dif.}../*.** Che
ff10: 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
ff20: 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   zDb..*/.int sql
ff30: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
ff40: 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  int_v2(.  sqlite
ff50: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
ff60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
ff70: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
ff80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
ff90: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
ffa0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74    /* Name of att
ffb0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28  ached database (
ffc0: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
ffd0: 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20  t eMode,        
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fff0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
10000 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NT_* value */.  
10010 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20  int *pnLog,     
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
10040 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65  WAL log in frame
10050 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b  s */.  int *pnCk
10060 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pt              
10070 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
10080 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66  otal number of f
10090 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74  rames checkpoint
100a0 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  ed */.){.#ifdef 
100b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
100c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
100d0 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  OK;.#else.  int 
100e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
100f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10100 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
10110 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45  int iDb = SQLITE
10120 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20  _MAX_ATTACHED;  
10130 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  /* sqlite3.aDb[]
10140 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20   index of db to 
10150 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23  checkpoint */..#
10160 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10170 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10180 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10190 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
101a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
101b0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
101c0 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  f..  /* Initiali
101d0 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
101e0 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
101f0 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
10200 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
10210 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
10220 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
10230 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
10240 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
10250 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
10260 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61  ASSIVE==0 );.  a
10270 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
10280 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31  ECKPOINT_FULL==1
10290 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
102a0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
102b0 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20  RESTART==2 );.  
102c0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
102d0 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
102e0 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65  TE==3 );.  if( e
102f0 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43  Mode<SQLITE_CHEC
10300 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c  KPOINT_PASSIVE |
10310 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43  | eMode>SQLITE_C
10320 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41  HECKPOINT_TRUNCA
10330 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TE ){.    /* EVI
10340 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39  DENCE-OF: R-0399
10350 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70 61  6-12088 The M pa
10360 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
10370 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69  a valid checkpoi
10380 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20  nt.    ** mode: 
10390 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
103a0 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
103b0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
103c0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
103d0 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26  x);.  if( zDb &&
103e0 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69   zDb[0] ){.    i
103f0 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
10400 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
10410 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30  .  }.  if( iDb<0
10420 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10430 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
10440 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
10450 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  sg(db, SQLITE_ER
10460 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  ROR, "unknown da
10470 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62  tabase: %s", zDb
10480 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10490 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
104a0 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20  kpoint(db, iDb, 
104b0 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
104c0 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ckpt);.    sqlit
104d0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
104e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
104f0 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
10500 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
10510 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10520 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
10530 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
10540 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
10550 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20  atabase zDb. If 
10560 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  zDb is NULL, or 
10570 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 44  if the buffer zD
10580 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63  b points.** to c
10590 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c  ontains a zero-l
105a0 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c  ength string, al
105b0 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
105c0 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65  ases are .** che
105d0 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e  ckpointed..*/.in
105e0 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
105f0 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
10600 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
10610 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49   *zDb){.  /* EVI
10620 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31  DENCE-OF: R-4161
10630 33 2d 32 30 35 35 33 20 54 68 65 20 73 71 6c 69  3-20553 The sqli
10640 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
10650 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75 69 76  nt(D,X) is equiv
10660 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71  alent to.  ** sq
10670 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
10680 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49  oint_v2(D,X,SQLI
10690 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
106a0 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20  SSIVE,0,0). */. 
106b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
106c0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
106d0 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f  2(db,zDb,SQLITE_
106e0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
106f0 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e  VE,0,0);.}..#ifn
10700 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10710 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  WAL./*.** Run a 
10720 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61  checkpoint on da
10730 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73  tabase iDb. This
10740 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64   is a no-op if d
10750 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a  atabase iDb is.*
10760 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  * not currently 
10770 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
10780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
10790 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
107a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
107b0 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
107c0 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  ted, this .** fu
107d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
107e0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64  QLITE_LOCKED and
107f0 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73   a checkpoint is
10800 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20   not attempted. 
10810 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
10820 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e  occurs while run
10830 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f  ning the checkpo
10840 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  int, an SQLite e
10850 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
10860 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20   returned (i.e. 
10870 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f  SQLITE_IOERR). O
10880 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
10890 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  _OK..**.** The m
108a0 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
108b0 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c   handle db shoul
108c0 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65  d be held by the
108d0 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74   caller. The mut
108e0 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  ex.** associated
108f0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
10900 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  ic b-tree being 
10910 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20  checkpointed is 
10920 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73  taken by.** this
10930 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
10940 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
10950 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s running..**.**
10960 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65   If iDb is passe
10970 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  d SQLITE_MAX_ATT
10980 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20  ACHED, then all 
10990 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
109a0 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70  es are.** checkp
109b0 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72  ointed. If an er
109c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
109d0 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  ed it is returne
109e0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a  d immediately -.
109f0 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73  ** no attempt is
10a00 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
10a10 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e  int any remainin
10a20 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  g databases..**.
10a30 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  ** Parameter eMo
10a40 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  de is one of SQL
10a50 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
10a60 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20  ASSIVE, FULL or 
10a70 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20  RESTART..*/.int 
10a80 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
10a90 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
10aa0 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64  nt iDb, int eMod
10ab0 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69  e, int *pnLog, i
10ac0 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69  nt *pnCkpt){.  i
10ad0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10ae0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
10af0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10b00 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
10b30 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74  erate through at
10b40 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20  tached dbs */.  
10b50 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20  int bBusy = 0;  
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54  /* True if SQLIT
10b80 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20  E_BUSY has been 
10b90 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a  encountered */..
10ba0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10bb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
10bc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
10bd0 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a  ert( !pnLog || *
10be0 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61  pnLog==-1 );.  a
10bf0 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c  ssert( !pnCkpt |
10c00 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b  | *pnCkpt==-1 );
10c10 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
10c20 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51  b->nDb && rc==SQ
10c30 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
10c40 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c     if( i==iDb ||
10c50 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58   iDb==SQLITE_MAX
10c60 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20  _ATTACHED ){.   
10c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
10c80 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64  treeCheckpoint(d
10c90 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65  b->aDb[i].pBt, e
10ca0 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
10cb0 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f  kpt);.      pnLo
10cc0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43  g = 0;.      pnC
10cd0 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  kpt = 0;.      i
10ce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
10cf0 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42  SY ){.        bB
10d00 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  usy = 1;.       
10d10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10d30 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
10d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
10d50 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42  Busy) ? SQLITE_B
10d60 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64  USY : rc;.}.#end
10d70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10d80 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
10d90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
10da0 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61  turns true if ma
10db0 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64  in-memory should
10dc0 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
10dd0 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61   of.** a tempora
10de0 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e  ry file for tran
10df0 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65  sient pager file
10e00 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20  s and statement 
10e10 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
10e20 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
10e30 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
10e40 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70  alue of db->temp
10e50 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a  _store (runtime.
10e60 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e  ** parameter) an
10e70 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69  d the compile ti
10e80 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49  me value of SQLI
10e90 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54  TE_TEMP_STORE. T
10ea0 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
10eb0 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
10ec0 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
10ed0 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74   between these t
10ee0 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64  wo values.** and
10ef0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   this functions 
10f00 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a  return value..**
10f10 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d  .**   SQLITE_TEM
10f20 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e  P_STORE     db->
10f30 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c  temp_store     L
10f40 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f  ocation of tempo
10f50 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  rary database.**
10f60 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
10f70 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
10f80 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
10f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
10fb0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
10fc0 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
10fd0 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
10fe0 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
10ff0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
11000 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
11010 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
11020 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
11030 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
11040 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
11060 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
11070 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   1).**   1      
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110a0 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
110b0 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
110e0 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
110f0 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
11120 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
11130 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
11140 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
11150 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
11160 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
11170 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
11180 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20  **   3          
11190 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
111b0 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
111c0 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1).*/.int sqlite
111d0 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f  3TempInMemory(co
111e0 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29  nst sqlite3 *db)
111f0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  {.#if SQLITE_TEM
11200 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74  P_STORE==1.  ret
11210 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
11220 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  tore==2 );.#endi
11230 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
11240 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74  P_STORE==2.  ret
11250 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
11260 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69  tore!=1 );.#endi
11270 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
11280 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74  P_STORE==3.  ret
11290 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  urn 1;.#endif.#i
112a0 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
112b0 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  ORE<1 || SQLITE_
112c0 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72  TEMP_STORE>3.  r
112d0 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
112e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
112f0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e  UTF-8 encoded En
11300 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
11310 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
11320 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
11330 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
11340 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
11350 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64  rrmsg(sqlite3 *d
11360 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
11370 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
11380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
11390 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
113a0 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20  E_NOMEM);.  }.  
113b0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
113c0 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
113d0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
113e0 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
113f0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
11400 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PT);.  }.  sqlit
11410 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11420 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
11430 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11440 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  d ){.    z = sql
11450 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
11460 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73  E_NOMEM);.  }els
11470 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e{.    testcase(
11480 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a   db->pErr==0 );.
11490 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73      z = (char*)s
114a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
114b0 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  t(db->pErr);.   
114c0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
114d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
114e0 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
114f0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
11500 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
11510 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
11520 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
11530 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
11540 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
11550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11560 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
11570 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63  eturn UTF-16 enc
11580 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
11590 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
115a0 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
115b0 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
115c0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
115d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73  lite3_errmsg16(s
115e0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
115f0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
11600 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20  outOfMem[] = {. 
11610 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
11620 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c  , ' ', 'o', 'f',
11630 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20   ' ', 'm', 'e', 
11640 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27  'm', 'o', 'r', '
11650 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61  y', 0.  };.  sta
11660 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69  tic const u16 mi
11670 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  suse[] = {.    '
11680 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72  l', 'i', 'b', 'r
11690 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27  ', 'a', 'r', 'y'
116a0 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c  , ' ', .    'r',
116b0 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
116c0 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27  'i', 'n', 'e', '
116d0 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61   ', .    'c', 'a
116e0 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27  ', 'l', 'l', 'e'
116f0 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'd', ' ', .   
11700 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
11710 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
11720 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73  f', ' ', .    's
11730 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27  ', 'e', 'q', 'u'
11740 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c  , 'e', 'n', 'c',
11750 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20   'e', 0.  };..  
11760 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20  const void *z;. 
11770 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
11780 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f  return (void *)o
11790 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69  utOfMem;.  }.  i
117a0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
117b0 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
117c0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
117d0 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b   (void *)misuse;
117e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
117f0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11800 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
11810 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11820 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a  .    z = (void *
11830 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c  )outOfMem;.  }el
11840 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  se{.    z = sqli
11850 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
11860 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
11870 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
11880 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
11890 74 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72  thMsg(db, db->er
118a0 72 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72  rCode, sqlite3Er
118b0 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
118c0 29 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  ));.      z = sq
118d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
118e0 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
118f0 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c    }.    /* A mal
11900 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66  loc() may have f
11910 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65  ailed within the
11920 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
11930 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
11940 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66      ** above. If
11950 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
11960 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e  e, then the db->
11970 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
11980 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  g needs to.    *
11990 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  * be cleared bef
119a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44  ore returning. D
119b0 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c  o this directly,
119c0 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a   instead of via.
119d0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70      ** sqlite3Ap
119e0 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69  iExit(), to avoi
119f0 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61  d setting the da
11a00 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72  tabase handle er
11a10 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20  ror message..   
11a20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
11a30 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
11a40 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
11a50 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
11a60 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
11a70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11a80 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
11a90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11aa0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
11ab0 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61  rror code genera
11ac0 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65  ted by an SQLite
11ad0 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c   routine. If NUL
11ae0 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74  L is.** passed t
11af0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
11b00 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c   we assume a mal
11b10 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72  loc() failed dur
11b20 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ing sqlite3_open
11b30 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
11b40 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  e3_errcode(sqlit
11b50 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
11b60 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
11b70 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
11b80 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
11b90 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
11ba0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
11bb0 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
11bc0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11be0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
11bf0 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20  n db->errCode & 
11c00 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69  db->errMask;.}.i
11c10 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
11c20 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  ded_errcode(sqli
11c30 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
11c40 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
11c50 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
11c60 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
11c70 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
11c80 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
11c90 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
11ca0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11cc0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
11cd0 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a  rn db->errCode;.
11ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11cf0 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
11d00 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
11d10 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
11d20 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
11d30 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77  gument.  For now
11d40 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61  , this simply ca
11d50 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  lls the internal
11d60 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29   sqlite3ErrStr()
11d70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
11d80 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
11d90 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20  ite3_errstr(int 
11da0 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  rc){.  return sq
11db0 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b  lite3ErrStr(rc);
11dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
11dd0 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
11de0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
11df0 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
11e00 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
11e10 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
11e20 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
11e30 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
11e40 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
11e50 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73  ite3* db,.  cons
11e60 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
11e70 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64    u8 enc,.  void
11e80 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
11e90 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
11ea0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
11eb0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
11ec0 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
11ed0 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53  oid*).){.  CollS
11ee0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
11ef0 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65   enc2;.  .  asse
11f00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11f10 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
11f20 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
11f30 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
11f40 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
11f50 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
11f60 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
11f70 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
11f80 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
11f90 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
11fa0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
11fb0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
11fc0 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
11fd0 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
11fe0 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
11ff0 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
12000 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
12010 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
12020 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
12030 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
12040 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
12050 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
12060 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
12070 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
12080 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
12090 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
120a0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
120b0 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
120c0 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
120d0 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
120e0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
120f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
12100 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
12110 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
12120 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
12130 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
12140 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
12150 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
12160 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
12170 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
12180 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
12190 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
121a0 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
121b0 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
121c0 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
121d0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
121e0 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
121f0 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
12200 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
12210 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
12220 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
12230 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
12240 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12250 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
12260 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
12270 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
12280 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
12290 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
122a0 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
122b0 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
122c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
122d0 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
122e0 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
122f0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
12300 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f  );..    /* If co
12310 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
12320 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74   pColl was creat
12330 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61  ed directly by a
12340 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
12350 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12360 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f  ollation, and no
12370 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  t generated by s
12380 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20  ynthCollSeq(),. 
12390 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63     ** then any c
123a0 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79  opies made by sy
123b0 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65  nthCollSeq() nee
123c0 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61  d to be invalida
123d0 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  ted..    ** Also
123e0 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74  , collation dest
123f0 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71  ructor - CollSeq
12400 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69  .xDel() - functi
12410 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  on may need.    
12420 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e  ** to be called.
12430 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28  .    */ .    if(
12440 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e   (pColl->enc & ~
12450 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
12460 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20  GNED)==enc2 ){. 
12470 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43       CollSeq *aC
12480 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
12490 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
124a0 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  Seq, zName);.   
124b0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
124c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
124d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
124e0 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b  Seq *p = &aColl[
124f0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
12500 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  p->enc==pColl->e
12510 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
12520 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20  if( p->xDel ){. 
12530 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44             p->xD
12540 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20  el(p->pUser);.  
12550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12560 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b      p->xCmp = 0;
12570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12580 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12590 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
125a0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
125b0 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
125c0 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d  1);.  if( pColl=
125d0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
125e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c  TE_NOMEM;.  pCol
125f0 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61  l->xCmp = xCompa
12600 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73  re;.  pColl->pUs
12610 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f  er = pCtx;.  pCo
12620 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
12630 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20  .  pColl->enc = 
12640 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63  (u8)(enc2 | (enc
12650 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   & SQLITE_UTF16_
12660 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c  ALIGNED));.  sql
12670 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
12680 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75  LITE_OK);.  retu
12690 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
126a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
126b0 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
126c0 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
126d0 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
126e0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
126f0 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
12700 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
12710 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
12720 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
12730 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
12740 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
12750 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
12760 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
12770 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
12780 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
12790 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
127a0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
127b0 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
127c0 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
127d0 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
127e0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
127f0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
12800 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
12810 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
12820 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
12830 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
12840 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
12850 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20  ARIABLE_NUMBER, 
12860 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
12870 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20  8091-32352 */.  
12880 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
12890 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  ER_DEPTH,.  SQLI
128a0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
128b0 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  READS,.};../*.**
128c0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68   Make sure the h
128d0 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73  ard limits are s
128e0 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65  et to reasonable
128f0 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53   values.*/.#if S
12900 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
12910 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
12920 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d  ITE_MAX_LENGTH m
12930 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
12940 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
12950 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
12960 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
12970 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
12980 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
12990 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
129a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
129b0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c  X_SQL_LENGTH>SQL
129c0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
129d0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
129e0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
129f0 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72  t not be greater
12a00 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
12a10 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23  _LENGTH.#endif.#
12a20 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
12a30 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a  MPOUND_SELECT<2.
12a40 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
12a50 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
12a60 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  CT must be at le
12a70 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66  ast 2.#endif.#if
12a80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
12a90 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53  _OP<40.# error S
12aa0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
12ab0 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  P must be at lea
12ac0 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66  st 40.#endif.#if
12ad0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
12ae0 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51  TION_ARG<0 || SQ
12af0 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
12b00 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72  N_ARG>1000.# err
12b10 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  or SQLITE_MAX_FU
12b20 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20  NCTION_ARG must 
12b30 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
12b40 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66   1000.#endif.#if
12b50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
12b60 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45  CHED<0 || SQLITE
12b70 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32  _MAX_ATTACHED>12
12b80 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  5.# error SQLITE
12b90 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75  _MAX_ATTACHED mu
12ba0 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
12bb0 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23  and 125.#endif.#
12bc0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  if SQLITE_MAX_LI
12bd0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
12be0 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
12bf0 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
12c00 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  ERN_LENGTH must 
12c10 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
12c20 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12c30 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37  MAX_COLUMN>32767
12c40 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
12c50 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20  MAX_COLUMN must 
12c60 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37  not exceed 32767
12c70 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
12c80 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
12c90 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  EPTH<1.# error S
12ca0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
12cb0 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20  R_DEPTH must be 
12cc0 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
12cd0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
12ce0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c  _WORKER_THREADS<
12cf0 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
12d00 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35  WORKER_THREADS>5
12d10 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
12d20 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
12d30 41 44 53 20 6d 75 73 74 20 62 65 20 62 65 74 77  ADS must be betw
12d40 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e  een 0 and 50.#en
12d50 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
12d60 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
12d70 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
12d80 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
12d90 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
12da0 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
12db0 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
12dc0 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
12dd0 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
12de0 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
12df0 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
12e00 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
12e10 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
12e20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
12e30 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
12e40 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
12e50 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
12e60 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
12e70 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
12e80 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
12e90 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
12ea0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
12eb0 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
12ec0 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
12ed0 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
12ee0 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a   int oldLimit;..
12ef0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12f00 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
12f10 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
12f20 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
12f30 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
12f40 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12f50 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
12f60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12f70 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
12f80 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65  0189-54097 For e
12f90 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f  ach limit catego
12fa0 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ry SQLITE_LIMIT_
12fb0 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20  NAME.  ** there 
12fc0 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20  is a hard upper 
12fd0 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d  bound set at com
12fe0 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43  pile-time by a C
12ff0 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20   preprocessor.  
13000 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ** macro called 
13010 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e  SQLITE_MAX_NAME.
13020 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20   (The "_LIMIT_" 
13030 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63  in the name is c
13040 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22  hanged to.  ** "
13050 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20  _MAX_".).  */.  
13060 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13070 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13080 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
13090 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
130a0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
130b0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
130c0 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  SQL_LENGTH]==SQL
130d0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
130e0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
130f0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13100 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d  E_LIMIT_COLUMN]=
13110 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  =SQLITE_MAX_COLU
13120 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  MN );.  assert( 
13130 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13140 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
13150 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
13160 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  EXPR_DEPTH );.  
13170 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13180 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13190 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
131a0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  ==SQLITE_MAX_COM
131b0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20  POUND_SELECT);. 
131c0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
131d0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
131e0 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54  _VDBE_OP]==SQLIT
131f0 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b  E_MAX_VDBE_OP );
13200 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13210 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13220 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
13230 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ==SQLITE_MAX_FUN
13240 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61  CTION_ARG );.  a
13250 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
13260 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41  t[SQLITE_LIMIT_A
13270 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45  TTACHED]==SQLITE
13280 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b  _MAX_ATTACHED );
13290 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
132a0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
132b0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
132c0 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20  LENGTH]==.      
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
13300 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
13310 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
13320 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13330 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
13340 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53  IABLE_NUMBER]==S
13350 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
13360 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73  LE_NUMBER);.  as
13370 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13380 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  [SQLITE_LIMIT_TR
13390 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51  IGGER_DEPTH]==SQ
133a0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
133b0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
133c0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
133d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
133e0 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c  ER_THREADS]==SQL
133f0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
13400 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65  HREADS );.  asse
13410 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  rt( SQLITE_LIMIT
13420 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d  _WORKER_THREADS=
13430 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  =(SQLITE_N_LIMIT
13440 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c  -1) );...  if( l
13450 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
13460 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
13470 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
13480 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
13490 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
134a0 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
134b0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134d0 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34     /* IMP: R-524
134e0 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20  76-28732 */.    
134f0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
13500 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
13510 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
13520 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
13530 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d  limitId];  /* IM
13540 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34  P: R-51463-25634
13550 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   */.    }.    db
13560 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
13570 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
13580 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
13590 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
135a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
135b0 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a   R-53341-35419 *
135c0 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  /.}../*.** This 
135d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
135e0 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55   to parse both U
135f0 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20  RIs and non-URI 
13600 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64  filenames passed
13610 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20   by the.** user 
13620 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
13630 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
13640 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
13650 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61  v2(), and for da
13660 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73  tabase.** URIs s
13670 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
13680 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65   of ATTACH state
13690 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
136a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
136b0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
136c0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
136d0 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28  the VFS to use (
136e0 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20  or.** a NULL to 
136f0 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61  signify the defa
13700 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20  ult VFS) if the 
13710 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  URI does not con
13720 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22  tain a "vfs=xxx"
13730 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
13740 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
13750 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  argument contain
13760 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f  s the URI (or no
13770 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a  n-URI filename).
13780 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20  ** itself. When 
13790 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
137a0 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c   called the *pFl
137b0 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ags variable sho
137c0 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74  uld contain.** t
137d0 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73  he default flags
137e0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
137f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74  abase handle wit
13800 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f  h. The value sto
13810 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67  red in.** *pFlag
13820 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64  s may be updated
13830 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
13840 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  g if the URI fil
13850 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a  ename contains .
13860 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f  ** "cache=xxx" o
13870 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65  r "mode=xxx" que
13880 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
13890 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
138a0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
138b0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
138c0 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69  is case *ppVfs i
138d0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
138e0 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61  o.** the VFS tha
138f0 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
13900 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
13910 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46  abase file. *pzF
13920 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  ile is set to.**
13930 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
13940 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
13950 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
13960 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69  le to open. It i
13970 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
13980 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
13990 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
139a0 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65  ally call sqlite
139b0 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65  3_free() to rele
139c0 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
139d0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  er..**.** If an 
139e0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
139f0 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  en an SQLite err
13a00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13a10 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73  ned and *pzErrMs
13a20 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  g.** may be set 
13a30 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
13a40 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
13a50 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
13a60 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65  age error .** me
13a70 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
13a80 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
13a90 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
13aa0 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
13ab0 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
13ac0 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  er by calling sq
13ad0 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
13ae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73  .int sqlite3Pars
13af0 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68  eUri(.  const ch
13b00 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c  ar *zDefaultVfs,
13b10 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
13b20 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73  o use if no "vfs
13b30 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69  =xxx" query opti
13b40 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
13b50 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20  ar *zUri,       
13b60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
13b70 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f  erminated URI to
13b80 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69   parse */.  unsi
13b90 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73  gned int *pFlags
13ba0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
13bb0 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50  N/OUT: SQLITE_OP
13bc0 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EN_XXX flags */.
13bd0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a    sqlite3_vfs **
13be0 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  ppVfs,          
13bf0 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f    /* OUT: VFS to
13c00 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20   use */ .  char 
13c10 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  **pzFile,       
13c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
13c30 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70  T: Filename comp
13c40 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a  onent of URI */.
13c50 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
13c60 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
13c70 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
13c80 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d  message (if rc!=
13c90 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b  SQLITE_OK) */.){
13ca0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13cb0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
13cc0 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70  d int flags = *p
13cd0 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  Flags;.  const c
13ce0 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66  har *zVfs = zDef
13cf0 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20  aultVfs;.  char 
13d00 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63  *zFile;.  char c
13d10 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73  ;.  int nUri = s
13d20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13d30 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Uri);..  assert(
13d40 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b   *pzErrMsg==0 );
13d50 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20  ..  if( ((flags 
13d60 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
13d70 49 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  I)             /
13d80 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33  * IMP: R-48725-3
13d90 32 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20  2206 */.        
13da0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
13db0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e  obalConfig.bOpen
13dc0 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  Uri) /* IMP: R-5
13dd0 31 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20  1689-46548 */.  
13de0 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d   && nUri>=5 && m
13df0 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c  emcmp(zUri, "fil
13e00 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d  e:", 5)==0 /* IM
13e10 50 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36  P: R-57884-37496
13e20 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61   */.  ){.    cha
13e30 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74  r *zOpt;.    int
13e40 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
13e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
13e60 72 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20  rser state when 
13e70 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20  parsing URI */. 
13e80 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20     int iIn;     
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63   /* Input charac
13eb0 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ter index */.   
13ec0 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20   int iOut = 0;  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ee0 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74  * Output charact
13ef0 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
13f00 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69  int nByte = nUri
13f10 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +2;           /*
13f20 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
13f30 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
13f40 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13f50 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
13f60 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74  _URI flag is set
13f70 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20   to indicate to 
13f80 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20  the VFS xOpen . 
13f90 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61     ** method tha
13fa0 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
13fb0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20  xtra parameters 
13fc0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
13fd0 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20  le-name.  */.   
13fe0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
13ff0 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20  _OPEN_URI;..    
14000 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e  for(iIn=0; iIn<n
14010 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74  Uri; iIn++) nByt
14020 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d  e += (zUri[iIn]=
14030 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ='&');.    zFile
14040 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
14050 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  c(nByte);.    if
14060 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
14070 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
14080 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69  .    iIn = 5;.#i
14090 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c  fndef SQLITE_ALL
140a0 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59  OW_URI_AUTHORITY
140b0 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
140c0 74 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61  the scheme and a
140d0 75 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74  uthority segment
140e0 73 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f  s of the URI. */
140f0 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d  .    if( zUri[5]
14100 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d  =='/' && zUri[6]
14110 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='/' ){.      i
14120 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68  In = 7;.      wh
14130 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26  ile( zUri[iIn] &
14140 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27  & zUri[iIn]!='/'
14150 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
14160 69 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69  if( iIn!=7 && (i
14170 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70  In!=16 || memcmp
14180 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a  ("localhost", &z
14190 55 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20  Uri[7], 9)) ){. 
141a0 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
141b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
141c0 74 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20  tf("invalid uri 
141d0 61 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22  authority: %.*s"
141e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
141f0 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b  In-7, &zUri[7]);
14200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14210 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
14220 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
14230 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ri_out;.      }.
14240 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
14250 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69    /* Copy the fi
14260 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71  lename and any q
14270 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
14280 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62  into the zFile b
14290 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44  uffer. .    ** D
142a0 65 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65  ecode %HH escape
142b0 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65   codes along the
142c0 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20   way. .    **.  
142d0 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73    ** Within this
142e0 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20   loop, variable 
142f0 65 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65  eState may be se
14300 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20  t to 0, 1 or 2, 
14310 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a  depending.    **
14320 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20   on the parsing 
14330 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c  context. As foll
14340 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ows:.    **.    
14350 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20  **   0: Parsing 
14360 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a  file-name..    *
14370 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e  *   1: Parsing n
14380 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  ame section of a
14390 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
143a0 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
143b0 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67   **   2: Parsing
143c0 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f   value section o
143d0 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
143e0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
143f0 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74      */.    eStat
14400 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  e = 0;.    while
14410 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
14420 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29  )!=0 && c!='#' )
14430 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20  {.      iIn++;. 
14440 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20       if( c=='%' 
14450 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
14460 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
14470 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26  iIn]) .       &&
14480 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
14490 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20  (zUri[iIn+1]) . 
144a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
144b0 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c  int octet = (sql
144c0 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
144d0 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b  i[iIn++]) << 4);
144e0 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b  .        octet +
144f0 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e  = sqlite3HexToIn
14500 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a  t(zUri[iIn++]);.
14510 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14520 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74   octet>=0 && oct
14530 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20  et<256 );.      
14540 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29    if( octet==0 )
14550 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
14560 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14570 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
14580 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
14590 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
145a0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
145b0 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
145c0 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
145d0 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
145e0 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
145f0 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
14600 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
14610 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
14620 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
14630 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
14640 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
14650 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
14660 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
14670 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
14680 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
14690 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
146a0 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
146b0 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
146c0 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
146d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
146e0 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
146f0 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
14700 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
14710 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
14720 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
14730 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14740 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
14750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14760 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
14780 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65   octet;.      }e
14790 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d  lse if( eState==
147a0 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20  1 && (c=='&' || 
147b0 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  c=='=') ){.     
147c0 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75     if( zFile[iOu
147d0 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1]==0 ){.     
147e0 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79       /* An empty
147f0 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67   option name. Ig
14800 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
14810 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a   altogether. */.
14820 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
14830 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
14840 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20  ri[iIn]!='#' && 
14850 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27  zUri[iIn-1]!='&'
14860 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
14870 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
14880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14890 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20  if( c=='&' ){.  
148a0 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f          zFile[iO
148b0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
148c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
148d0 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
148e0 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
148f0 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
14900 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74    }else if( (eSt
14910 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27  ate==0 && c=='?'
14920 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20  ) || (eState==2 
14930 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20  && c=='&') ){.  
14940 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
14950 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
14960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
14970 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63  File[iOut++] = c
14980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14990 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c  eState==1 ) zFil
149a0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
149b0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
149c0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
149d0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
149e0 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  '\0';..    /* Ch
149f0 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72  eck if there wer
14a00 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70  e any options sp
14a10 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f  ecified that sho
14a20 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74  uld be interpret
14a30 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e  ed .    ** here.
14a40 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   Options that ar
14a50 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65  e interpreted he
14a60 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22  re include "vfs"
14a70 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a   and those that.
14a80 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
14a90 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20  d to flags that 
14aa0 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f  may be passed to
14ab0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65   the sqlite3_ope
14ac0 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65  n_v2().    ** me
14ad0 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70  thod. */.    zOp
14ae0 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74  t = &zFile[sqlit
14af0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
14b00 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
14b10 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20   zOpt[0] ){.    
14b20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c    int nOpt = sql
14b30 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
14b40 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
14b50 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70  zVal = &zOpt[nOp
14b60 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  t+1];.      int 
14b70 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
14b80 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20  rlen30(zVal);.. 
14b90 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33       if( nOpt==3
14ba0 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22   && memcmp("vfs"
14bb0 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b  , zOpt, 3)==0 ){
14bc0 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20  .        zVfs = 
14bd0 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zVal;.      }els
14be0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
14bf0 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
14c00 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
14c10 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
14c20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
14c30 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
14c40 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
14c50 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  odeType = 0;.   
14c60 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
14c70 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
14c80 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  imit = 0;..     
14c90 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26     if( nOpt==5 &
14ca0 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22  & memcmp("cache"
14cb0 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b  , zOpt, 5)==0 ){
14cc0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
14cd0 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
14ce0 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d  e aCacheMode[] =
14cf0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
14d00 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49   "shared",  SQLI
14d10 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
14d20 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
14d30 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20     { "private", 
14d40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
14d50 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
14d60 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
14d70 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
14d80 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
14d90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
14da0 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f  EDCACHE|SQLITE_O
14db0 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
14dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
14dd0 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a  e = aCacheMode;.
14de0 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
14df0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
14e00 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63    zModeType = "c
14e10 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d  ache";.        }
14e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
14e30 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==4 && memcmp("
14e40 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d  mode", zOpt, 4)=
14e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14e60 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
14e70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65  enMode aOpenMode
14e80 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
14e90 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49     { "ro",  SQLI
14ea0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
14eb0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
14ec0 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f  { "rw",  SQLITE_
14ed0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
14ee0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  , .            {
14ef0 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f   "rwc", SQLITE_O
14f00 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
14f10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
14f20 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  TE },.          
14f30 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51    { "memory", SQ
14f40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
14f50 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
14f60 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
14f70 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
14f80 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
14f90 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53  PEN_READONLY | S
14fa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
14fb0 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
14fc0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
14fd0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
14fe0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
14ff0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  Y;.          aMo
15000 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a  de = aOpenMode;.
15010 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
15020 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a  = mask & flags;.
15030 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
15040 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a  ype = "access";.
15050 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
15060 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a     if( aMode ){.
15070 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
15080 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
15090 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
150a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64     for(i=0; aMod
150b0 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20  e[i].z; i++){.  
150c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
150d0 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b  char *z = aMode[
150e0 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  i].z;.          
150f0 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69    if( nVal==sqli
15100 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26  te3Strlen30(z) &
15110 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c  & 0==memcmp(zVal
15120 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20  , z, nVal) ){.  
15130 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
15140 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65   = aMode[i].mode
15150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15160 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
15170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
15180 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
15190 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
151a0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
151b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
151c0 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f  f("no such %s mo
151d0 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79  de: %s", zModeTy
151e0 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
151f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15200 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
15210 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
15220 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
15230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15240 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c  if( (mode & ~SQL
15250 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
15260 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
15270 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
15280 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15290 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61  f("%s mode not a
152a0 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20  llowed: %s",.   
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20       zModeType, 
152e0 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
152f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
15300 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERM;.           
15310 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
15320 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
15330 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
15340 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73   = (flags & ~mas
15350 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20  k) | mode;.     
15360 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
15370 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c      zOpt = &zVal
15380 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a  [nVal+1];.    }.
15390 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
153a0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
153b0 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20  lloc(nUri+2);.  
153c0 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
153d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
153e0 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  EM;.    memcpy(z
153f0 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69  File, zUri, nUri
15400 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  );.    zFile[nUr
15410 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  i] = '\0';.    z
15420 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27  File[nUri+1] = '
15430 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  \0';.    flags &
15440 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  = ~SQLITE_OPEN_U
15450 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66  RI;.  }..  *ppVf
15460 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
15470 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66  find(zVfs);.  if
15480 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20  ( *ppVfs==0 ){. 
15490 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
154a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
154b0 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22  no such vfs: %s"
154c0 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20  , zVfs);.    rc 
154d0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
154e0 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f    }. parse_uri_o
154f0 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
15500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
15510 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
15520 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  e);.    zFile = 
15530 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73  0;.  }.  *pFlags
15540 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46   = flags;.  *pzF
15550 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72  ile = zFile;.  r
15560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
15570 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15580 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
15590 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
155a0 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
155b0 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
155c0 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
155d0 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
155e0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
155f0 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
15600 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
15610 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15620 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
15630 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
15640 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
15650 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
15660 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
15670 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
15680 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
15690 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
156a0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
156b0 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
156c0 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
156d0 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
156e0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
156f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15700 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
15710 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
15720 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
15730 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
15740 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
15750 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
15760 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
15770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15780 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
15790 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
157b0 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
157c0 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
157d0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
157e0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
157f0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
15800 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
15810 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
15820 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
15830 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
15840 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
15850 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
15860 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
15870 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
15880 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
15890 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
158a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
158b0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
158c0 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
158d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
158e0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
158f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
15900 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
15910 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15920 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  ;.#endif..  /* O
15930 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62  nly allow sensib
15940 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  le combinations 
15950 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66  of bits in the f
15960 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20  lags argument.  
15970 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65  .  ** Throw an e
15980 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d  rror if any non-
15990 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sense combinatio
159a0 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77  n is used.  If w
159b0 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c  e.  ** do not bl
159c0 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62  ock illegal comb
159d0 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69  inations here, i
159e0 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a  t could trigger.
159f0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74    ** assert() st
15a00 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70  atements in deep
15a10 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73  er layers.  Sens
15a20 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
15a30 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a  s.  ** are:.  **
15a40 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54  .  **  1:  SQLIT
15a50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a  E_OPEN_READONLY.
15a60 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45    **  2:  SQLITE
15a70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
15a80 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45    **  6:  SQLITE
15a90 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
15aa0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
15ab0 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65  EATE.  */.  asse
15ac0 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
15ad0 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30  READONLY  == 0x0
15ae0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
15af0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
15b00 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a  RITE == 0x02 );.
15b10 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
15b20 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20  _OPEN_CREATE    
15b30 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73  == 0x04 );.  tes
15b40 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
15b50 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f  s&7))==0x02 ); /
15b60 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20  * READONLY */.  
15b70 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
15b80 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29  lags&7))==0x04 )
15b90 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a  ; /* READWRITE *
15ba0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
15bb0 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
15bc0 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  40 ); /* READWRI
15bd0 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20  TE | CREATE */. 
15be0 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73   if( ((1<<(flags
15bf0 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20  &7)) & 0x46)==0 
15c00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15c10 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
15c20 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34  ;  /* IMP: R-654
15c30 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a  97-44594 */.  }.
15c40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
15c50 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
15c60 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Mutex==0 ){.    
15c70 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
15c80 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
15c90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
15ca0 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20  N_NOMUTEX ){.   
15cb0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
15cc0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
15cd0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
15ce0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a  EN_FULLMUTEX ){.
15cf0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
15d00 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
15d10 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
15d20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
15d30 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
15d40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
15d50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
15d60 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a  PRIVATECACHE ){.
15d70 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
15d80 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
15d90 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69  CACHE;.  }else i
15da0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
15db0 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
15dc0 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
15dd0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
15de0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
15df0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  E;.  }..  /* Rem
15e00 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
15e10 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
15e20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20  parameter.  **. 
15e30 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f   ** The SQLITE_O
15e40 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20  PEN_NOMUTEX and 
15e50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
15e60 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65  MUTEX flags were
15e70 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
15e80 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
15e90 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65   code block.  Be
15ea0 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65  sides these, the
15eb0 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64   only.  ** valid
15ec0 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72   input flags for
15ed0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
15ee0 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50  () are SQLITE_OP
15ef0 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a  EN_READONLY,.  *
15f00 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  * SQLITE_OPEN_RE
15f10 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f  ADWRITE, SQLITE_
15f20 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c  OPEN_CREATE, SQL
15f30 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
15f40 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ACHE,.  ** SQLIT
15f50 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
15f60 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65  CHE, and some re
15f70 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69  served bits.  Si
15f80 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
15f90 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
15fa0 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
15fb0 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
15fc0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
15fd0 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
15fe0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
15ff0 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
16000 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16010 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
16020 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
16030 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
16040 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
16050 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16060 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
16070 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
16080 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
16090 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
160b0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
160c0 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
160d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
160e0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
160f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16100 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
16110 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16130 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
16140 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
16150 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
16160 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  LLMUTEX |.      
16170 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16180 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20  OPEN_WAL.       
16190 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
161a0 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
161b0 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
161c0 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
161d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
161e0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
161f0 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
16200 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
16210 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
16220 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  afe ){.    db->m
16230 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
16240 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
16250 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
16260 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75  ;.    if( db->mu
16270 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
16280 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
16290 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a  ;.      db = 0;.
162a0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
162b0 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
162c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
162d0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
162e0 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
162f0 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e   = 0xff;.  db->n
16300 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61  Db = 2;.  db->ma
16310 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
16320 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61  IC_BUSY;.  db->a
16330 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
16340 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ic;..  assert( s
16350 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
16360 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c  )==sizeof(aHardL
16370 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70  imit) );.  memcp
16380 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48  y(db->aLimit, aH
16390 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66  ardLimit, sizeof
163a0 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20  (db->aLimit));. 
163b0 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
163c0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
163d0 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54  THREADS] = SQLIT
163e0 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52  E_DEFAULT_WORKER
163f0 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e  _THREADS;.  db->
16400 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
16410 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
16420 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a  c = -1;.  db->sz
16430 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c  Mmap = sqlite3Gl
16440 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
16450 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  p;.  db->nextPag
16460 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
16470 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
16480 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20  = 0x7FFFFFFF;.  
16490 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
164a0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
164b0 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s | SQLITE_Enabl
164c0 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54  eTrigger | SQLIT
164d0 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66  E_CacheSpill.#if
164e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
164f0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
16500 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c  IC_INDEX) || SQL
16510 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
16520 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
16540 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a  QLITE_AutoIndex.
16550 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
16560 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
16570 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
16580 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
16590 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
165a0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
165b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
165c0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
165d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
165e0 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
165f0 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
16600 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
16610 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
16640 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
16650 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
16660 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
16670 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
16680 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
16690 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
166a0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
166b0 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
166c0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
166d0 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f  LITE_REVERSE_UNO
166e0 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a  RDERED_SELECTS).
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16700 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   | SQLITE_Revers
16710 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 20 20  eOrder.#endif.  
16720 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48      ;.  sqlite3H
16730 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f  ashInit(&db->aCo
16740 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
16750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
16760 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
16770 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
16780 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
16790 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64  ..  /* Add the d
167a0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
167b0 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
167c0 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66  . BINARY works f
167d0 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20  or both UTF-8.  
167e0 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73  ** and UTF-16, s
167f0 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20  o add a version 
16800 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69  for each to avoi
16810 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72  d any unnecessar
16820 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f  y.  ** conversio
16830 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72  ns. The only err
16840 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75  or that can occu
16850 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c  r here is a mall
16860 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20  oc() failure..  
16870 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  **.  ** EVIDENCE
16880 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38  -OF: R-52786-448
16890 37 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65  78 SQLite define
168a0 73 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e  s three built-in
168b0 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20   collating.  ** 
168c0 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a  functions:.  */.
168d0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
168e0 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
168f0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
16900 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
16910 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
16920 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
16930 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
16940 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
16950 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
16960 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
16970 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  RY", SQLITE_UTF1
16980 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6LE, 0, binCollF
16990 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
169a0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
169b0 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
169c0 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
169d0 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
169e0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
169f0 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
16a00 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
16a10 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46  oid*)1, binCollF
16a20 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
16a30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16a40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
16a50 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a  db_out;.  }.  /*
16a60 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16a70 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20  08308-17224 The 
16a80 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
16a90 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  g function for a
16aa0 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  ll.  ** strings 
16ab0 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f  is BINARY. .  */
16ac0 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
16ad0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
16ae0 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
16af0 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c  _UTF8, "BINARY",
16b00 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64   0);.  assert( d
16b10 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20  b->pDfltColl!=0 
16b20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  );..  /* Parse t
16b30 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20  he filename/URI 
16b40 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64  argument. */.  d
16b50 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
16b60 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c  lags;.  rc = sql
16b70 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66  ite3ParseUri(zVf
16b80 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  s, zFilename, &f
16b90 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c  lags, &db->pVfs,
16ba0 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73   &zOpen, &zErrMs
16bb0 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
16bc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16bd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
16be0 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63  MEM ) db->malloc
16bf0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
16c00 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
16c10 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72  Msg(db, rc, zErr
16c20 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
16c30 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
16c40 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
16c50 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  sg);.    goto op
16c60 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
16c70 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
16c80 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
16c90 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  iver */.  rc = s
16ca0 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
16cb0 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c  db->pVfs, zOpen,
16cc0 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d   db, &db->aDb[0]
16cd0 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  .pBt, 0,.       
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
16d00 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20  OPEN_MAIN_DB);. 
16d10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16d20 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
16d30 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
16d40 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
16d50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
16d60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16d70 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
16d80 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
16d90 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  _out;.  }.  sqli
16da0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 64 62  te3BtreeEnter(db
16db0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
16dc0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68   db->aDb[0].pSch
16dd0 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
16de0 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61  emaGet(db, db->a
16df0 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66  Db[0].pBt);.  if
16e00 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
16e10 6c 65 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20  led ) ENC(db) = 
16e20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a  SCHEMA_ENC(db);.
16e30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16e40 61 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ave(db->aDb[0].p
16e50 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  Bt);.  db->aDb[1
16e60 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
16e70 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
16e80 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64   0);..  /* The d
16e90 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65  efault safety_le
16ea0 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  vel for the main
16eb0 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75   database is 'fu
16ec0 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d  ll'; for the tem
16ed0 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  p.  ** database 
16ee0 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68  it is 'NONE'. Th
16ef0 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  is matches the p
16f00 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75  ager layer defau
16f10 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62  lts.  .  */.  db
16f20 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[0].zName =
16f30 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61   "main";.  db->a
16f40 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[0].safety_lev
16f50 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44  el = 3;.  db->aD
16f60 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65  b[1].zName = "te
16f70 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  mp";.  db->aDb[1
16f80 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
16f90 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63   1;..  db->magic
16fa0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
16fb0 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  OPEN;.  if( db->
16fc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
16fd0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
16fe0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  out;.  }..  /* R
16ff0 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c  egister all buil
17000 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20  t-in functions, 
17010 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  but do not attem
17020 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20  pt to read the. 
17030 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68   ** database sch
17040 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73  ema yet. This is
17050 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
17060 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
17070 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
17080 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a  is accessed..  *
17090 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  /.  sqlite3Error
170a0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
170b0 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
170c0 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  erBuiltinFunctio
170d0 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  ns(db);..  /* Lo
170e0 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
170f0 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
17100 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
17110 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
17120 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
17130 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
17140 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
17150 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
17160 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
17170 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
17190 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65  ite3AutoLoadExte
171a0 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20  nsions(db);.    
171b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
171c0 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66  code(db);.    if
171d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
171e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  ){.      goto op
171f0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
17200 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
17210 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
17220 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
17230 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
17240 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
17250 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
17260 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
17270 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
17280 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
17290 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
172a0 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
172b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
172c0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
172d0 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
172e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
172f0 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
17300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
17310 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
17320 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
17330 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
17340 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  3.  if( !db->mal
17350 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
17360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
17380 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
17390 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
173a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
173b0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
173c0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
173d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
173e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75   rc = sqlite3Icu
173f0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
17400 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
17410 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
17420 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17430 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
17440 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
17450 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65  rc = sqlite3Rtre
17460 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  eInit(db);.  }.#
17470 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51  endif..  /* -DSQ
17480 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
17490 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65  KING_MODE=1 make
174a0 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20  s EXCLUSIVE the 
174b0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
174c0 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51    ** mode.  -DSQ
174d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
174e0 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65  KING_MODE=0 make
174f0 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
17500 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
17510 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f   mode.  Doing no
17520 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73  thing at all als
17530 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74  o makes NORMAL t
17540 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  he default..  */
17550 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17560 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
17570 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f  ODE.  db->dfltLo
17580 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ckMode = SQLITE_
17590 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
175a0 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50  MODE;.  sqlite3P
175b0 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
175c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
175d0 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  r(db->aDb[0].pBt
175e0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17600 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
17610 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69  ING_MODE);.#endi
17620 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71  f..  if( rc ) sq
17630 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
17640 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65  c);..  /* Enable
17650 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d   the lookaside-m
17660 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
17670 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73  */.  setupLookas
17680 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74  ide(db, 0, sqlit
17690 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
176a0 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20  zLookaside,.    
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
176d0 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
176e0 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  de);..  sqlite3_
176f0 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
17700 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45  nt(db, SQLITE_DE
17710 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48  FAULT_WAL_AUTOCH
17720 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e  ECKPOINT);..open
17730 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  db_out:.  sqlite
17740 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20  3_free(zOpen);. 
17750 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61   if( db ){.    a
17760 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78  ssert( db->mutex
17770 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73  !=0 || isThreads
17780 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  afe==0 || sqlite
17790 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
177a0 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  ullMutex==0 );. 
177b0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
177c0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
177d0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
177e0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
177f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  );.  assert( db!
17800 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
17810 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20  _NOMEM );.  if( 
17820 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
17830 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
17840 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64  close(db);.    d
17850 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  b = 0;.  }else i
17860 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17870 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
17880 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
17890 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70  _SICK;.  }.  *pp
178a0 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20  Db = db;.#ifdef 
178b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
178c0 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74  LLOG.  if( sqlit
178d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
178e0 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a  Sqllog ){.    /*
178f0 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61   Opening a db ha
17900 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
17910 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
17920 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20   0. */.    void 
17930 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47  *pArg = sqlite3G
17940 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
17950 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69  logArg;.    sqli
17960 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17970 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62  xSqllog(pArg, db
17980 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  , zFilename, 0);
17990 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
179a0 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45  turn sqlite3ApiE
179b0 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  xit(0, rc);.}../
179c0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
179d0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
179e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
179f0 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
17a00 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  ar *zFilename, .
17a10 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
17a20 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70   .){.  return op
17a30 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
17a40 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20  name, ppDb,.    
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
17a70 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
17a80 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
17a90 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
17aa0 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74  open_v2(.  const
17ab0 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
17ac0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
17ad0 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20  ilename (UTF-8) 
17ae0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
17af0 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pDb,         /* 
17b00 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68  OUT: SQLite db h
17b10 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  andle */.  int f
17b20 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
17b30 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20     /* Flags */. 
17b40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
17b50 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  s        /* Name
17b60 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74   of VFS module t
17b70 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  o use */.){.  re
17b80 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
17b90 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  e(filename, ppDb
17ba0 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
17bb0 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a  flags, zVfs);.}.
17bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17bd0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
17be0 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
17bf0 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
17c00 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
17c10 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16(.  const void
17c20 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
17c30 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29  sqlite3 **ppDb.)
17c40 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
17c50 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a  zFilename8;   /*
17c60 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64   zFilename encod
17c70 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74  ed in UTF-8 inst
17c80 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f  ead of UTF-16 */
17c90 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
17ca0 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
17cb0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
17cc0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
17cd0 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
17ce0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
17cf0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
17d00 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
17d10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d20 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
17d30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
17d40 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
17d50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17d60 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46  .#endif.  if( zF
17d70 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69  ilename==0 ) zFi
17d80 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30  lename = "\000\0
17d90 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  00";.  pVal = sq
17da0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
17db0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
17dc0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
17dd0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
17de0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
17df0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
17e00 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
17e10 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
17e20 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
17e30 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
17e40 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
17e50 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
17e60 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17e90 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
17ea0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17eb0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
17ec0 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
17ed0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
17ee0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17ef0 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
17f00 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
17f10 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
17f20 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d  ) ){.      SCHEM
17f30 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45  A_ENC(*ppDb) = E
17f40 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
17f50 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
17f60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
17f70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17f80 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OMEM;.  }.  sqli
17f90 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
17fa0 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71  l);..  return sq
17fb0 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
17fc0 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  rc);.}.#endif /*
17fd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
17fe0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
17ff0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
18000 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
18010 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
18020 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
18030 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
18040 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
18050 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
18060 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
18070 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
18080 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
18090 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
180a0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
180b0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
180c0 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  id*).){.  return
180d0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
180e0 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
180f0 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74   zName, enc, pCt
18100 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
18110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
18120 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
18130 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
18140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
18150 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
18160 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
18170 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73  ollation_v2(.  s
18180 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
18190 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
181a0 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
181b0 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
181c0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
181d0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
181e0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
181f0 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
18200 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
18210 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
18220 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
18230 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
18240 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
18250 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
18260 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
18270 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
18280 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18290 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
182a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
182b0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
182c0 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
182d0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
182e0 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
182f0 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
18300 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20  re, xDel);.  rc 
18310 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
18320 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
18330 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
18340 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
18350 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
18360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18370 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
18380 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
18390 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
183a0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
183b0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
183c0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
183d0 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20  _collation16(.  
183e0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
183f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
18400 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  e,.  int enc, . 
18410 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
18420 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
18430 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
18440 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
18450 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
18460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18470 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23  char *zName8;..#
18480 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18490 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
184a0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
184b0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
184c0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
184d0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
184e0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
184f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18500 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
18510 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
18520 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
18530 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65   zName8 = sqlite
18540 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e  3Utf16to8(db, zN
18550 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
18560 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
18570 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20  if( zName8 ){.  
18580 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
18590 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
185a0 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  8, (u8)enc, pCtx
185b0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
185c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
185d0 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20  e(db, zName8);. 
185e0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
185f0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
18600 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18610 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18620 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
18630 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
18640 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
18650 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
18660 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
18670 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
18680 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
18690 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
186a0 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
186b0 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
186c0 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
186d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
186e0 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
186f0 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
18700 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20  eded(.  sqlite3 
18710 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
18720 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
18730 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
18740 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  ed)(void*,sqlite
18750 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
18760 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
18770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18780 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
18790 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
187a0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
187b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
187c0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
187d0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
187e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
187f0 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
18800 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65  Needed = xCollNe
18810 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  eded;.  db->xCol
18820 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20  lNeeded16 = 0;. 
18830 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
18840 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
18850 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
18860 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
18870 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
18880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
18890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
188a0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
188b0 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
188c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
188d0 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
188e0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
188f0 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
18900 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
18910 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
18920 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
18930 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
18940 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
18950 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20  ion_needed16(.  
18960 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
18970 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
18980 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
18990 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f  CollNeeded16)(vo
189a0 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
189b0 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
189c0 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66  void*).){.#ifdef
189d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
189e0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
189f0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
18a00 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
18a10 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
18a20 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
18a30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
18a40 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
18a50 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
18a60 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c   = 0;.  db->xCol
18a70 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c  lNeeded16 = xCol
18a80 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d  lNeeded16;.  db-
18a90 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
18aa0 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
18ab0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18ac0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18ad0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
18ae0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
18af0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18b00 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
18b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
18b20 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
18b30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18b40 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69  now an anachroni
18b50 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  sm. It used to b
18b60 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65  e used to recove
18b70 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c  r from a.** mall
18b80 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75  oc() failure, bu
18b90 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65  t SQLite now doe
18ba0 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63  s this automatic
18bb0 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
18bc0 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
18bd0 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ver(void){.  ret
18be0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18bf0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
18c00 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
18c10 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61  er or not the da
18c20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18c30 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  n is in autocomm
18c40 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74  it.** mode.  Ret
18c50 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
18c60 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
18c70 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  ot.  Autocommit 
18c80 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79  mode is on.** by
18c90 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63   default.  Autoc
18ca0 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65  ommit is disable
18cb0 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61  d by a BEGIN sta
18cc0 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61  tement and reena
18cd0 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e  bled.** by the n
18ce0 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  ext COMMIT or RO
18cf0 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  LLBACK..*/.int s
18d00 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
18d10 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
18d20 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
18d30 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
18d40 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
18d50 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
18d60 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
18d70 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
18d80 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
18d90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
18da0 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
18db0 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
18dc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
18dd0 74 69 6e 65 73 20 61 72 65 20 73 75 62 73 74 69  tines are substi
18de0 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61  tutes for consta
18df0 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  nts SQLITE_CORRU
18e00 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  PT,.** SQLITE_MI
18e10 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  SUSE, SQLITE_CAN
18e20 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f  TOPEN, SQLITE_IO
18e30 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ERR and possibly
18e40 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
18e50 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79  constants.  They
18e60 20 73 65 72 76 65 20 74 77 6f 20 70 75 72 70 6f   serve two purpo
18e70 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
18e80 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
18e90 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
18ea0 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
18eb0 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
18ec0 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
18ed0 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
18ee0 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
18ef0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
18f00 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
18f10 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
18f20 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
18f30 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
18f40 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
18f50 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
18f60 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
18f70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
18f80 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
18f90 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
18fa0 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
18fb0 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
18fc0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
18fd0 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
18fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18ff0 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
19000 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20  tion at line %d 
19010 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
19020 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
19030 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
19040 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
19050 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19060 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  PT;.}.int sqlite
19070 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
19080 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
19090 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
190a0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
190b0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
190c0 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  og(SQLITE_MISUSE
190d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
190e0 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65   "misuse at line
190f0 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
19100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
19110 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
19120 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
19130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
19140 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ISUSE;.}.int sql
19150 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f  ite3CantopenErro
19160 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
19170 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
19180 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
19190 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
191a0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
191b0 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20  ANTOPEN, .      
191c0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
191d0 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e  open file at lin
191e0 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
191f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19200 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
19210 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
19220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19230 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69  CANTOPEN;.}...#i
19240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19250 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
19260 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
19270 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
19280 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
19290 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
192a0 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
192b0 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
192c0 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
192d0 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
192e0 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
192f0 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
19300 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
19310 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
19320 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
19330 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
19340 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
19350 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
19360 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
19370 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
19380 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19390 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
193a0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
193b0 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
193c0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
193d0 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
193e0 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
193f0 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
19400 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69  or details..*/.i
19410 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  nt sqlite3_table
19420 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
19430 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  /* Connection ha
19460 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
19470 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20  char *zDbName,  
19480 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
19490 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a  e name or NULL *
194a0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
194b0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  zTableName,     
194c0 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
194d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
194e0 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f  ColumnName,    /
194f0 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
19500 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
19510 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f  pzDataType,    /
19520 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72  * OUTPUT: Declar
19530 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a  ed data type */.
19540 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
19550 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a  zCollSeq,     /*
19560 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69   OUTPUT: Collati
19570 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
19580 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e   */.  int *pNotN
19590 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
195a0 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
195b0 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  e if NOT NULL co
195c0 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20  nstraint exists 
195d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61  */.  int *pPrima
195e0 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ryKey,          
195f0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
19600 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20   if column part 
19610 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  of PK */.  int *
19620 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20  pAutoinc        
19630 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
19640 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
19650 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65   is auto-increme
19660 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
19670 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
19680 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  sg = 0;.  Table 
19690 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c  *pTab = 0;.  Col
196a0 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
196b0 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68   int iCol;..  ch
196c0 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
196d0 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
196e0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
196f0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
19700 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
19710 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
19720 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
19730 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
19740 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
19750 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
19760 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
19770 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
19780 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
19790 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
197a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
197b0 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
197c0 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
197d0 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
197e0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
197f0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
19800 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
19810 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
19820 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
19830 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
19840 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
19850 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
19860 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
19870 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
19880 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
19890 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
198a0 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
198b0 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
198c0 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a  ested */.  if( z
198d0 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b  ColumnName==0 ){
198e0 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f  .    /* Query fo
198f0 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74  r existance of t
19900 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d  able only */.  }
19910 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
19920 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
19930 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
19940 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
19950 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
19960 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
19970 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
19980 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
19990 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
199a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
199b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
199c0 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
199d0 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
199e0 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71  owid(pTab) && sq
199f0 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
19a00 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
19a10 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62       iCol = pTab
19a20 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
19a30 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20   pCol = iCol>=0 
19a40 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  ? &pTab->aCol[iC
19a50 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  ol] : 0;.      }
19a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
19a70 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
19a80 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
19a90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19aa0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
19ab0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
19ac0 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
19ad0 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
19ae0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
19af0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
19b00 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
19b10 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
19b20 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
19b30 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
19b40 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
19b50 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
19b60 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
19b70 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
19b80 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
19b90 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
19ba0 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
19bb0 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
19bc0 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
19bd0 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
19be0 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
19bf0 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
19c00 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
19c10 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
19c20 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
19c30 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
19c40 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
19c50 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
19c60 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
19c70 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
19c80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
19c90 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
19ca0 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
19cb0 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f   zDataType = pCo
19cc0 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43  l->zType;.    zC
19cd0 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
19ce0 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
19cf0 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
19d00 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
19d10 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63  ykey  = (pCol->c
19d20 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
19d30 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20  G_PRIMKEY)!=0;. 
19d40 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
19d50 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
19d60 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
19d70 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
19d80 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
19d90 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
19da0 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
19db0 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
19dc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
19dd0 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
19de0 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
19df0 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
19e00 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
19e10 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
19e20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
19e30 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
19e40 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
19e50 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
19e60 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
19e70 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
19e80 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
19e90 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
19ea0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
19eb0 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
19ec0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
19ed0 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
19ee0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
19ef0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
19f00 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
19f10 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
19f20 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
19f30 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
19f40 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
19f50 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
19f60 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
19f70 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
19f80 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
19f90 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
19fa0 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
19fb0 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
19fc0 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
19fd0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
19fe0 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
19ff0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
1a000 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
1a010 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
1a020 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
1a030 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
1a040 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
1a050 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
1a060 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
1a070 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1a080 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
1a090 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
1a0a0 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
1a0b0 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
1a0c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a0d0 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
1a0e0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
1a0f0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
1a100 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a110 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1a120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a130 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
1a140 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
1a150 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
1a160 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
1a170 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1a180 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
1a190 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1a1a0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
1a1b0 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
1a1c0 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
1a1d0 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
1a1e0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
1a1f0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
1a200 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
1a210 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
1a220 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
1a230 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
1a240 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
1a250 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
1a260 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
1a270 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
1a280 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
1a290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a2a0 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
1a2b0 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
1a2c0 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
1a2d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a2e0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
1a2f0 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
1a300 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23  b, int onoff){.#
1a310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a320 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1a330 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1a340 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1a350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1a360 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1a370 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1a380 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1a390 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
1a3a0 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66  k = onoff ? 0xff
1a3b0 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20  ffffff : 0xff;. 
1a3c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1a3d0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1a3e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a3f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1a400 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f  voke the xFileCo
1a410 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20  ntrol method on 
1a420 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1a430 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
1a440 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1a450 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ol(sqlite3 *db, 
1a460 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1a470 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  ame, int op, voi
1a480 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
1a490 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1a4a0 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  R;.  Btree *pBtr
1a4b0 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ee;..#ifdef SQLI
1a4c0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1a4d0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1a4e0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1a4f0 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1a500 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1a510 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1a520 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1a530 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72  ->mutex);.  pBtr
1a540 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  ee = sqlite3DbNa
1a550 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1a560 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42  bName);.  if( pB
1a570 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
1a580 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73  r *pPager;.    s
1a590 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
1a5a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a5b0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1a5c0 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
1a5d0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
1a5e0 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
1a5f0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1a600 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65  .    fd = sqlite
1a610 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
1a620 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
1a630 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  fd!=0 );.    if(
1a640 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1a650 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
1a660 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
1a670 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
1a680 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  fd;.      rc = S
1a690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1a6a0 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
1a6b0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
1a6c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1a6d0 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
1a6e0 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
1a6f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1a700 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
1a710 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1a720 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1a730 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a740 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a750 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1a760 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a  n rc;   .}../*.*
1a770 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74  * Interface to t
1a780 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63  he testing logic
1a790 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a7a0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
1a7b0 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  t op, ...){.  in
1a7c0 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  t rc = 0;.#ifnde
1a7d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
1a7e0 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f  ILTIN_TEST.  va_
1a7f0 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
1a800 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
1a810 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
1a820 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65    /*.    ** Save
1a830 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1a840 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a  te of the PRNG..
1a850 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1a860 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a870 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20  PRNG_SAVE: {.   
1a880 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61     sqlite3PrngSa
1a890 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  veState();.     
1a8a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1a8b0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
1a8c0 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f  tore the state o
1a8d0 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68  f the PRNG to th
1a8e0 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76  e last state sav
1a8f0 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ed using.    ** 
1a900 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50  PRNG_SAVE.  If P
1a910 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76  RNG_SAVE has nev
1a920 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63  er before been c
1a930 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  alled, then.    
1a940 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74  ** this verb act
1a950 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45  s like PRNG_RESE
1a960 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  T..    */.    ca
1a970 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1a980 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
1a990 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1a9a0 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65  PrngRestoreState
1a9b0 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
1a9c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1a9d0 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20     ** Reset the 
1a9e0 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73  PRNG back to its
1a9f0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
1aa00 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20  tate.  The next 
1aa10 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
1aa20 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1aa30 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20  s() will reseed 
1aa40 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61  the PRNG using a
1aa50 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20   single call.   
1aa60 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64   ** to the xRand
1aa70 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66  omness method of
1aa80 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
1aa90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1aaa0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1aab0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a  L_PRNG_RESET: {.
1aac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
1aad0 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20  ndomness(0,0);. 
1aae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1aaf0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1ab00 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ab10 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45  ontrol(BITVEC_TE
1ab20 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61  ST, size, progra
1ab30 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m).    **.    **
1ab40 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69   Run a test agai
1ab50 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a  nst a Bitvec obj
1ab60 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68  ect of size.  Th
1ab70 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65  e program argume
1ab80 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20  nt.    ** is an 
1ab90 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
1aba0 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  s that defines t
1abb0 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e  he test.  Return
1abc0 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20   -1 on a.    ** 
1abd0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1abe0 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75  n error, 0 on su
1abf0 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  ccess, or non-ze
1ac00 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  ro for an error.
1ac10 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20  .    ** See the 
1ac20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
1ac30 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61  ltinTest() for a
1ac40 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1ac50 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
1ac60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ac70 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
1ac80 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ST: {.      int 
1ac90 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
1aca0 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
1acb0 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28  *aProg = va_arg(
1acc0 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
1acd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
1ace0 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73  vecBuiltinTest(s
1acf0 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20  z, aProg);.     
1ad00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1ad10 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1ad20 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1ad30 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  ol(FAULT_INSTALL
1ad40 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20  , xCallback).   
1ad50 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e   **.    ** Arran
1ad60 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61  ge to invoke xCa
1ad70 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65  llback() wheneve
1ad80 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  r sqlite3FaultSi
1ad90 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20  m() is called,. 
1ada0 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61     ** if xCallba
1adb0 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ck is not NULL..
1adc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73      **.    ** As
1add0 20 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66   a test of the f
1ade0 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d  ault simulator m
1adf0 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c  echanism itself,
1ae00 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1ae10 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61  (0).    ** is ca
1ae20 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
1ae30 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e   after installin
1ae40 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61  g the new callba
1ae50 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ck and the retur
1ae60 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66  n.    ** value f
1ae70 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  rom sqlite3Fault
1ae80 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74  Sim(0) becomes t
1ae90 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20  he return from. 
1aea0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65     ** sqlite3_te
1aeb0 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20  st_control()..  
1aec0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1aed0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41  LITE_TESTCTRL_FA
1aee0 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20  ULT_INSTALL: {. 
1aef0 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
1af00 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
1af10 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
1af20 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
1af30 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
1af40 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
1af50 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
1af60 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
1af70 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
1af80 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
1af90 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29  ap, int(*)(int))
1afa0 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
1afb0 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45   typedef int(*TE
1afc0 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74  STCALLBACKFUNC_t
1afd0 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  )(int);.      sq
1afe0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1aff0 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20  g.xTestCallback 
1b000 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53  = va_arg(ap, TES
1b010 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1b020 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1b030 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b  ite3FaultSim(0);
1b040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b050 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1b060 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1b070 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
1b080 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
1b090 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
1b0a0 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
1b0b0 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
1b0c0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
1b0d0 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
1b0e0 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
1b0f0 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
1b100 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b110 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
1b120 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
1b130 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
1b140 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
1b150 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
1b160 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1b170 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
1b180 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
1b190 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
1b1a0 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
1b1b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1b1c0 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
1b1d0 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
1b1e0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1b1f0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1b200 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
1b210 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
1b220 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
1b230 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
1b240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1b250 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1b260 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1b270 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1b280 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
1b290 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
1b2a0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1b2b0 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
1b2c0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
1b2d0 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
1b2e0 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
1b2f0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
1b300 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
1b310 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
1b320 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
1b330 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
1b340 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1b350 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
1b360 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
1b370 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
1b380 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
1b390 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
1b3a0 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
1b3b0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
1b3c0 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
1b3d0 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
1b3e0 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1b3f0 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
1b400 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
1b410 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
1b420 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
1b430 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
1b440 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20   ** deleterious 
1b450 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
1b460 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b470 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
1b480 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
1b490 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
1b4a0 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
1b4b0 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
1b4c0 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
1b4d0 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
1b4e0 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
1b4f0 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
1b500 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
1b510 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
1b520 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
1b530 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1b550 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1b560 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1b570 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1b580 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
1b590 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1b5a0 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
1b5b0 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
1b5c0 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
1b5d0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
1b5e0 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
1b5f0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
1b600 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
1b610 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
1b620 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
1b630 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1b640 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1b650 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
1b660 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
1b670 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1b680 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1b690 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
1b6a0 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
1b6b0 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
1b6c0 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
1b6d0 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
1b6e0 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
1b6f0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
1b700 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
1b710 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
1b720 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1b730 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
1b740 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
1b750 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
1b760 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b770 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1b780 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
1b790 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
1b7a0 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
1b7b0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
1b7c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
1b7d0 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
1b7e0 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
1b7f0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1b800 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1b810 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1b820 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
1b830 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1b840 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
1b850 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
1b860 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
1b870 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
1b880 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
1b890 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
1b8a0 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
1b8b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
1b8c0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
1b8d0 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
1b8e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
1b8f0 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
1b900 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
1b910 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
1b920 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
1b930 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
1b940 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
1b950 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
1b960 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
1b970 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
1b980 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
1b990 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1b9a0 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
1b9b0 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
1b9c0 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
1b9d0 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
1b9e0 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
1b9f0 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
1ba00 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
1ba10 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
1ba20 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
1ba30 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
1ba40 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
1ba50 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ba60 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
1ba70 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
1ba80 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
1ba90 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
1baa0 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
1bab0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
1bac0 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
1bad0 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
1bae0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1baf0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1bb00 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1bb10 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1bb20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bb30 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
1bb40 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
1bb50 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
1bb60 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1bb70 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
1bb80 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1bb90 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1bba0 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
1bbb0 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
1bbc0 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
1bbd0 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
1bbe0 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
1bbf0 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
1bc00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1bc10 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1bc20 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1bc30 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
1bc40 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1bc50 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
1bc60 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
1bc70 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
1bc80 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
1bc90 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
1bca0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1bcb0 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
1bcc0 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
1bcd0 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
1bce0 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
1bcf0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1bd00 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1bd10 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
1bd20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
1bd30 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
1bd40 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
1bd50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bd60 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1bd70 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1bd80 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1bd90 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
1bda0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1bdb0 20 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74   The integer ret
1bdc0 75 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68  urned reveals th
1bdd0 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20  e byte-order of 
1bde0 74 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20  the computer on 
1bdf0 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c  which.    ** SQL
1be00 69 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a  ite is running:.
1be10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1be20 20 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e      1     big-en
1be30 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69  dian,    determi
1be40 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a  ned at run-time.
1be50 20 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20      **      10  
1be60 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
1be70 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
1be80 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  run-time.    ** 
1be90 20 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d   432101     big-
1bea0 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72  endian,    deter
1beb0 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
1bec0 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32  -time.    **  12
1bed0 33 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d  3410     little-
1bee0 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e  endian, determin
1bef0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
1bf00 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63  me.    */ .    c
1bf10 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1bf20 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b  TRL_BYTEORDER: {
1bf30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1bf40 54 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30  TE_BYTEORDER*100
1bf50 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45   + SQLITE_LITTLE
1bf60 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49  ENDIAN*10 + SQLI
1bf70 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20  TE_BIGENDIAN;.  
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 20 73 71 6c 69 74  ..    /*   sqlit
1bfa0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1bfb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1bfc0 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33  RESERVE, sqlite3
1bfd0 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
1bfe0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1bff0 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65  he nReserve size
1c000 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61   to N for the ma
1c010 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  in database on t
1c020 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
1c030 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
1c040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c050 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1c060 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20  L_RESERVE: {.   
1c070 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1c080 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1c090 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  te3*);.      int
1c0a0 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
1c0b0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
1c0c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1c0d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1c0e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1c0f0 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  PageSize(db->aDb
1c100 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30  [0].pBt, 0, x, 0
1c110 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c120 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1c130 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
1c140 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c150 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
1c160 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1c170 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1c180 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33  ZATIONS, sqlite3
1c190 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
1c1a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
1c1b0 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72  e or disable var
1c1c0 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
1c1d0 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ns for testing p
1c1e0 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20  urposes.  The . 
1c1f0 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e     ** argument N
1c200 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
1c210 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
1c220 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20  o be disabled.  
1c230 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a  For normal.    *
1c240 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68  * operation N sh
1c250 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1c260 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74  idea is that a t
1c270 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b  est program (lik
1c280 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  e the.    ** SQL
1c290 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53   Logic Test or S
1c2a0 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20  LT test module) 
1c2b0 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65  can run the same
1c2c0 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69   SQL multiple ti
1c2d0 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  mes.    ** with 
1c2e0 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
1c2f0 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74  tions disabled t
1c300 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
1c310 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
1c320 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64    ** is obtained
1c330 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a   in every case..
1c340 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c350 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c360 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b  OPTIMIZATIONS: {
1c370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1c380 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1c390 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1c3a0 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20   db->dbOptFlags 
1c3b0 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61  = (u16)(va_arg(a
1c3c0 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66  p, int) & 0xffff
1c3d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c3e0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1c3f0 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20  LITE_N_KEYWORD. 
1c400 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
1c410 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1c420 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
1c430 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72  WORD, const char
1c440 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a   *zWord).    **.
1c450 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20      ** If zWord 
1c460 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63  is a keyword rec
1c470 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70  ognized by the p
1c480 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75  arser, then retu
1c490 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75  rn the.    ** nu
1c4a0 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73  mber of keywords
1c4b0 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69  .  Or if zWord i
1c4c0 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c  s not a keyword,
1c4d0 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a   return 0..    *
1c4e0 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  * .    ** This t
1c4f0 65 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f  est feature is o
1c500 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  nly available in
1c510 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
1c520 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74  n since.    ** t
1c530 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  he SQLITE_N_KEYW
1c540 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  ORD macro is not
1c550 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73   defined in this
1c560 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a   file if SQLite.
1c570 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20      ** is built 
1c580 75 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73  using separate s
1c590 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20  ource files..   
1c5a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c5b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
1c5c0 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20  EYWORD: {.      
1c5d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
1c5e0 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  d = va_arg(ap, c
1c5f0 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
1c600 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
1c610 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64  e3Strlen30(zWord
1c620 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  );.      rc = (s
1c630 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
1c640 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29  e((u8*)zWord, n)
1c650 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54  !=TK_ID) ? SQLIT
1c660 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b  E_N_KEYWORD : 0;
1c670 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c680 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20    }.#endif ..   
1c690 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
1c6a0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1c6b0 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
1c6c0 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65  MALLOC, sz, &pNe
1c6d0 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a  w, pFree);.    *
1c6e0 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46  *.    ** Pass pF
1c6f0 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33  ree into sqlite3
1c700 53 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a  ScratchFree(). .
1c710 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74      ** If sz>0 t
1c720 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73  hen allocate a s
1c730 63 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e  cratch buffer in
1c740 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a  to pNew.  .    *
1c750 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1c760 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
1c770 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20  CHMALLOC: {.    
1c780 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a    void *pFree, *
1c790 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e  *ppNew;.      in
1c7a0 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d  t sz;.      sz =
1c7b0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1c7c0 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20  ;.      ppNew = 
1c7d0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
1c7e0 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20  *);.      pFree 
1c7f0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1c800 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  d*);.      if( s
1c810 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c  z ) *ppNew = sql
1c820 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
1c830 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  c(sz);.      sql
1c840 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
1c850 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72  pFree);.      br
1c860 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c870 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1c880 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1c890 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
1c8a0 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f  IME_FAULT, int o
1c8b0 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  noff);.    **.  
1c8c0 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65    ** If paramete
1c8d0 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a  r onoff is non-z
1c8e0 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74  ero, configure t
1c8f0 68 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74  he wrappers so t
1c900 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  hat all.    ** s
1c910 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1c920 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61  to localtime() a
1c930 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c  nd variants fail
1c940 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65  . If onoff is ze
1c950 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20  ro,.    ** undo 
1c960 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20  this setting..  
1c970 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c980 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
1c990 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b  CALTIME_FAULT: {
1c9a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1c9b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61  obalConfig.bLoca
1c9c0 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f  ltimeFault = va_
1c9d0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1c9e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c9f0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1ca00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ca10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ca20 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69  NEVER_CORRUPT, i
1ca30 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt);.    **.    
1ca40 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
1ca50 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
1ca60 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64  cates that the d
1ca70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1ca80 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20  always well-.   
1ca90 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e   ** formed and n
1caa0 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54  ever corrupt.  T
1cab0 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61  his flag is clea
1cac0 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e  r by default, in
1cad0 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20  dicating that.  
1cae0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1caf0 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61  les might have a
1cb00 72 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74  rbitrary corrupt
1cb10 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68  ion.  Setting th
1cb20 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20  e flag during.  
1cb30 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75    ** testing cau
1cb40 73 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65  ses certain asse
1cb50 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1cb60 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62  in the code to b
1cb70 65 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20  e activated.    
1cb80 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72  ** that demonstr
1cb90 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e  at invariants on
1cba0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
1cbb0 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20  abase files..   
1cbc0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1cbd0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
1cbe0 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20  ER_CORRUPT: {.  
1cbf0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1cc00 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72  lConfig.neverCor
1cc10 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70  rupt = va_arg(ap
1cc20 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1cc30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
1cc40 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1cc50 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1cc60 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f  E_TESTCTRL_VDBE_
1cc70 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62  COVERAGE, xCallb
1cc80 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a  ack, ptr);.    *
1cc90 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1cca0 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63   VDBE coverage c
1ccb0 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
1ccc0 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69   to xCallback wi
1ccd0 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20  th context .    
1cce0 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a  ** pointer ptr..
1ccf0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1cd00 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cd10 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b  VDBE_COVERAGE: {
1cd20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
1cd30 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20  DBE_COVERAGE.   
1cd40 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
1cd50 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  (*branch_callbac
1cd60 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c  k)(void*,int,u8,
1cd70 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  u8);.      sqlit
1cd80 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1cd90 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f  VdbeBranch = va_
1cda0 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61  arg(ap,branch_ca
1cdb0 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73  llback);.      s
1cdc0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1cdd0 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72  ig.pVdbeBranchAr
1cde0 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f  g = va_arg(ap,vo
1cdf0 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  id*);.#endif.   
1ce00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ce10 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1ce20 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1ce30 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
1ce40 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20  ORTER_MMAP, db, 
1ce50 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61  nMax); */.    ca
1ce60 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ce70 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20  RL_SORTER_MMAP: 
1ce80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1ce90 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1cea0 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1ceb0 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
1cec0 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
1ced0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1cee0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1cef0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1cf00 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cf10 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
1cf20 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1cf30 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1cf40 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20  K if SQLite has 
1cf50 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
1cf60 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f   and SQLITE_ERRO
1cf70 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e  R if.    ** not.
1cf80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1cf90 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1cfa0 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20  _ISINIT: {.     
1cfb0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1cfc0 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d  alConfig.isInit=
1cfd0 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
1cfe0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1cff0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1d000 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
1d010 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1d020 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
1d030 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1d040 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
1d050 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69   a utility routi
1d060 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46  ne, useful to VF
1d070 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
1d080 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a  s, that checks.*
1d090 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61  * to see if a da
1d0a0 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20  tabase file was 
1d0b0 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61  a URI that conta
1d0c0 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20  ined a specific 
1d0d0 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65  query .** parame
1d0e0 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f  ter, and if so o
1d0f0 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  btains the value
1d100 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61   of the query pa
1d110 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
1d120 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1d130 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c  ument is the fil
1d140 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61  ename pointer pa
1d150 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f  ssed into the xO
1d160 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  pen().** method 
1d170 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65  of a VFS impleme
1d180 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50  ntation.  The zP
1d190 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73  aram argument is
1d1a0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1d1b0 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
1d1c0 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68  ter we seek.  Th
1d1d0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1d1e0 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1d1f0 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61  the zParam.** pa
1d200 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78  rameter if it ex
1d210 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61  ists.  If the pa
1d220 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
1d230 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75   exist, this rou
1d240 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1d250 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
1d260 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1d270 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1d280 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  eter(const char 
1d290 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
1d2a0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b  t char *zParam){
1d2b0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1d2c0 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30  ==0 || zParam==0
1d2d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1d2e0 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1d2f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1d300 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
1d310 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
1d320 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
1d330 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
1d340 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
1d350 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1d360 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1d370 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
1d380 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
1d390 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
1d3a0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1d3b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d3c0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1d3d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1d3e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1d3f0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
1d400 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
1d410 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
1d420 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
1d430 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1d440 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
1d450 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
1d460 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
1d470 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1d480 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1d490 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1d4a0 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
1d4b0 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
1d4c0 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
1d4d0 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
1d4e0 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
1d4f0 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
1d500 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
1d510 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
1d520 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
1d530 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1d540 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
1d550 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1d560 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
1d570 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
1d580 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
1d590 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
1d5a0 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
1d5b0 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
1d5c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1d5d0 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
1d5e0 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
1d5f0 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
1d600 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1d610 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
1d620 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
1d630 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1d640 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1d650 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
1d660 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
1d670 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49  I64(z, &v)==SQLI
1d680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66  TE_OK ){.    bDf
1d690 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  lt = v;.  }.  re
1d6a0 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  turn bDflt;.}../
1d6b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d6c0 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64  Btree pointer id
1d6d0 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e  entified by zDbN
1d6e0 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ame.  Return NUL
1d6f0 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1d700 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65  */.Btree *sqlite
1d710 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73  3DbNameToBtree(s
1d720 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1d730 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
1d740 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1d750 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1d760 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
1d770 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20  b->aDb[i].pBt.  
1d780 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d     && (zDbName==
1d790 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
1d7a0 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d  Cmp(zDbName, db-
1d7b0 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  >aDb[i].zName)==
1d7c0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
1d7d0 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69  return db->aDb[i
1d7e0 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ].pBt;.    }.  }
1d7f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1d800 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1d810 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
1d820 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
1d830 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
1d840 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
1d850 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
1d860 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
1d870 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
1d880 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1d890 7a 44 62 4e 61 6d 65 29 7b 0a 23 69 66 64 65 66  zDbName){.#ifdef
1d8a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1d8b0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1d8c0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1d8d0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1d8e0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1d8f0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1d900 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
1d910 69 66 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  if.  Btree *pBt 
1d920 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1d930 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1d940 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
1d950 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
1d960 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29  GetFilename(pBt)
1d970 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
1d980 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61 62  eturn 1 if datab
1d990 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ase is read-only
1d9a0 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77 72   or 0 if read/wr
1d9b0 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ite.  Return -1 
1d9c0 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61  if.** no such da
1d9d0 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a  tabase exists..*
1d9e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
1d9f0 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65  _readonly(sqlite
1da00 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1da10 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 23 69 66  r *zDbName){.#if
1da20 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1da30 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1da40 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1da50 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1da60 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1da70 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1da80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1da90 23 65 6e 64 69 66 0a 20 20 42 74 72 65 65 20 2a  #endif.  Btree *
1daa0 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1dab0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1dac0 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1dad0 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1dae0 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70  treeIsReadonly(p
1daf0 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a              Bt) : -1;.}.