/ Hex Artifact Content
Login

Artifact 292a67f4f803068ce5d160cfe76c052d8713e045:


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 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1310: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 7b  NABLE_SQLLOG.  {
1320: 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1330: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
1340: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
1350: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
1360: 6c 6f 67 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  log();.  }.#endi
1370: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
1380: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1390: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
13a0: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
13b0: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
13c0: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
13d0: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
13e0: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
13f0: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
1400: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
1410: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
1420: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
1430: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
1440: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
1450: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
1460: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
1470: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
1480: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
1490: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
14a0: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
14b0: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
14c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
14d0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
14e0: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
14f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1500: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
1510: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
1520: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
1530: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
1540: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
1550: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1560: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1570: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
1580: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
1590: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
15a0: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
15b0: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
15c0: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
15d0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
15e0: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
15f0: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
1600: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
1610: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
1620: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
1630: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
1640: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
1650: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1660: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
1670: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
1680: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1690: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
16b0: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
16c0: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
16d0: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
16e0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
16f0: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
1700: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1710: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1730: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
1740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1750: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1760: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1770: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1780: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1790: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
17b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
17c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
17d0: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
17e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
17f0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1800: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
1810: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1820: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
1830: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
1840: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1850: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1860: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1870: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
18b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
18c0: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
18d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18e0: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
18f0: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1900: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1910: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1920: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1930: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1940: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1950: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1960: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1970: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1980: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1990: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
19a0: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
19b0: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
19c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19e0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
19f0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1a00: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1a10: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1a20: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1a30: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1a40: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1a50: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1a60: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1a70: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1a80: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a90: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1aa0: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1ab0: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1ac0: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1ad0: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1ae0: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1af0: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1b00: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1b10: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1b20: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1b30: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1b40: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1b50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1b60: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1b70: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1b80: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1b90: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1ba0: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1bb0: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1bc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1bd0: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1be0: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1bf0: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1c00: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1c10: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1c20: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1c30: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1c40: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1c50: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1c60: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1c70: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1c80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c90: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1ca0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1cb0: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1cc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1cd0: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1ce0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cf0: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1d00: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1d10: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1d20: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1d30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1d40: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1d50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d60: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1d70: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1d80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1d90: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1da0: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
1db0: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
1dc0: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
1dd0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( 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 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
1e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1e10: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
1e20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1e50: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1e60: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
1e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e80: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
1e90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ea0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1eb0: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1ec0: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1ed0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1ee0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1ef0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f00: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
1f10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1f20: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
1f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f40: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
1f50: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1f60: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
1f70: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
1f80: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1f90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fa0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1fb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1fc0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fe0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1ff0: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
2000: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
2010: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
2020: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
2030: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
2040: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
2050: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2060: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2070: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2080: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2090: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
20a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
20b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
20c0: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
20d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
20f0: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
2100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
2110: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
2120: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2130: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
2140: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2150: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2160: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2170: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2180: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2190: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
21a0: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
21b0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
21c0: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
21d0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
21e0: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
21f0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
2200: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
2210: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
2220: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
2230: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
2240: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
2250: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2260: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2270: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2280: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2290: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
22a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
22c0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
22d0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
22e0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
22f0: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
2300: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
2310: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2320: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2330: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2340: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2350: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2360: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2370: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2380: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2390: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
23a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
23b0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
23c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
23d0: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
23e0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23f0: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2400: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2410: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2420: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2430: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2440: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2450: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2460: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2470: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2480: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24a0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
24b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
24c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24d0: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
24e0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
24f0: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2500: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2510: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2520: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2530: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2540: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2550: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2560: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2570: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2580: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2590: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
25a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
25b0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
25c0: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
25d0: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
25e0: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
25f0: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2600: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2610: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2620: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2630: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2640: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2650: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2660: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2670: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2680: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2690: 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  id){.  if( sqlit
26a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
26b0: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
26c0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
26d0: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
26e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
26f0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2700: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2710: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2720: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2730: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2740: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2750: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2760: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2770: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2780: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2790: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
27a0: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
27b0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
27c0: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
27d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27e0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
27f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2800: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2810: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2820: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2830: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2840: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2850: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2860: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2870: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2880: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2890: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
28a0: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
28b0: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
28c0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
28d0: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
28e0: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
28f0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2900: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2910: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2920: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2930: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2940: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2950: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2960: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2970: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2980: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2990: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
29a0: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
29b0: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
29c0: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
29d0: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
29e0: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
29f0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2a00: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2a10: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2a20: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2a30: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2a40: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2a50: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2a60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2a70: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2a80: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2a90: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2aa0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2ab0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2ac0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2ad0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2ae0: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2af0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2b00: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2b10: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2b20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2b40: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2b50: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2b60: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2b70: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2b80: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2b90: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2ba0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bb0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2bc0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2bd0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2be0: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2bf0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2c00: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c10: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2c20: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2c30: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2c40: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2c50: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2c60: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2c70: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2c80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2c90: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2ca0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2cb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cc0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2cd0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2ce0: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2cf0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2d00: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2d10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2d20: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2d30: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2d40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d50: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2d60: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2d70: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
2d80: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
2d90: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
2da0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
2db0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
2dc0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
2dd0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2de0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2df0: 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66   .    */.#if def
2e00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
2e10: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
2e20: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20  E_THREADSAFE>0. 
2e30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2e40: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
2e50: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e60: 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  isable all mutex
2e70: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2e80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2e90: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b  .bCoreMutex = 0;
2ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2eb0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ec0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
2ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ee0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2ef0: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
2f00: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2f10: 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66  able mutexing of
2f20: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2f30: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f  tions */.      /
2f40: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e  * Enable mutexin
2f50: 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73  g of core data s
2f60: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
2f70: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2f80: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2f90: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2fa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fb0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
2fc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2fd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2fe0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41  ITE_CONFIG_SERIA
2ff0: 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f  LIZED: {.      /
3000: 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74  * Enable all mut
3010: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
3020: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3030: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3040: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
3050: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3060: 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  llMutex = 1;.   
3070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3090: 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a  CONFIG_MUTEX: {.
30a0: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79        /* Specify
30b0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
30c0: 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61  mutex implementa
30d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
30e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
30f0: 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72  g.mutex = *va_ar
3100: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
3110: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  tex_methods*);. 
3120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3130: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3140: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
3150: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
3160: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
3170: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
3180: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3190: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
31a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
31b0: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
31c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
31d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20     }.#endif...  
31f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3200: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
3210: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3220: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
3230: 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61  alloc implementa
3240: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3250: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3260: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
3270: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3280: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
3290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
32b0: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
32c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
32d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  e the current ma
32e0: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
32f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
3300: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3310: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
3320: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
3330: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
3340: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
3350: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3360: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3370: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
3380: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3390: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
33a0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
33b0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  US: {.      /* E
33c0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
33d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74   the malloc stat
33e0: 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f  us collection */
33f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3400: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
3410: 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tat = va_arg(ap,
3420: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3430: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3440: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3450: 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20  _SCRATCH: {.    
3460: 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61    /* Designate a
3470: 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72 61   buffer for scra
3480: 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  tch memory space
3490: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
34b0: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
34c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
34d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
34e0: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
34f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3500: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3510: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3520: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3530: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3550: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3560: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3570: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
3580: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
3590: 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72  page cache memor
35a0: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
35b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
35c0: 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f  nfig.pPage = va_
35d0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
35e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
35f0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
3600: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3610: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3620: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
3630: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3640: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3650: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3660: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3670: 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  G_PCACHE: {.    
3680: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
3690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
36a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
36b0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
36c0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
36d0: 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  w an error */.  
36e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36f0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3700: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3710: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3720: 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  G_PCACHE2: {.   
3730: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
3740: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
3750: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
3760: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3770: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3780: 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76  fig.pcache2 = *v
3790: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37a0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
37b0: 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  2*);.      break
37c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
37d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
37e0: 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  ETPCACHE2: {.   
37f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3800: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3810: 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  e2.xInit==0 ){. 
3820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43         sqlite3PC
3830: 61 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29  acheSetDefault()
3840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3850: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3860: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
3870: 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ds2*) = sqlite3G
3880: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
3890: 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  he2;.      break
38a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
38b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
38c0: 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64  LE_MEMSYS3) || d
38d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
38e0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20  ABLE_MEMSYS5).  
38f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3900: 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20  NFIG_HEAP: {.   
3910: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
3920: 61 20 62 75 66 66 65 72 20 66 6f 72 20 68 65 61  a buffer for hea
3930: 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  p memory space *
3940: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3950: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
3960: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  p = va_arg(ap, v
3970: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3980: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3990: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
39a0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
39b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39c0: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61  fig.mnReq = va_a
39d0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20  rg(ap, int);..  
39e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
39f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3a00: 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  q<1 ){.        s
3a10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3a20: 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20  ig.mnReq = 1;.  
3a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
3a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3a50: 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20  g.mnReq>(1<<12) 
3a60: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61  ){.        /* ca
3a70: 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69  p min request si
3a80: 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20  ze at 2^12 */.  
3a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3aa0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
3ab0: 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20  = (1<<12);.     
3ac0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
3ad0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3ae0: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
3af0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
3b00: 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20  heap pointer is 
3b10: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f  NULL, then resto
3b20: 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d  re the malloc im
3b30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20  plementation.   
3b40: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
3b50: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f  NULL pointers to
3b60: 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  o.  This will ca
3b70: 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74  use the malloc t
3b80: 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  o go.        ** 
3b90: 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61  back to its defa
3ba0: 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ult implementati
3bb0: 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f  on when sqlite3_
3bc0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a  initialize() is.
3bd0: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a          ** run..
3be0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
3bf0: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
3c00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3c10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
3c20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c30: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
3c40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
3c50: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
3c60: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3c70: 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74  install one of t
3c80: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  he.        ** me
3c90: 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68  m5.c/mem3.c meth
3ca0: 6f 64 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73  ods.  The enclos
3cb0: 69 6e 67 20 23 69 66 20 67 75 61 72 61 6e 74 65  ing #if guarante
3cc0: 65 73 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a  es at.        **
3cd0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
3ce0: 65 73 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63  ese methods is c
3cf0: 75 72 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64  urrently enabled
3d00: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
3d10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3d20: 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20  E_MEMSYS3.      
3d30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3d40: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
3d50: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28  e3MemGetMemsys3(
3d60: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
3d70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
3d80: 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73  EMSYS5.        s
3d90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3da0: 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d  ig.m = *sqlite3M
3db0: 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a  emGetMemsys5();.
3dc0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
3dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3de0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61  }.#endif..    ca
3df0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3e00: 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20  _LOOKASIDE: {.  
3e10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3e20: 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
3e30: 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ide = va_arg(ap,
3e40: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3e50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3e60: 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61  .nLookaside = va
3e70: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3e80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3e90: 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65  }.    .    /* Re
3ea0: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
3eb0: 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e  o the logger fun
3ec0: 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69  ction and its fi
3ed0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
3ee0: 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
3ef0: 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69   is NULL.  Loggi
3f00: 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ng is disabled i
3f10: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  f the function p
3f20: 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a  ointer is.    **
3f30: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
3f40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3f50: 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20  NFIG_LOG: {.    
3f60: 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
3f70: 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
3f80: 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
3f90: 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
3fa0: 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
3fb0: 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
3fc0: 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
3fd0: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
3fe0: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
3ff0: 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28  arg(ap, void(*)(
4000: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
4010: 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a  char*));.      *
4020: 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
4030: 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29  void(*LOGFUNC_t)
4040: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
4050: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73   char*);.      s
4060: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4070: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
4080: 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b  (ap, LOGFUNC_t);
4090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
40a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41  obalConfig.pLogA
40b0: 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  rg = va_arg(ap, 
40c0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72  void*);.      br
40d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
40e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40f0: 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20  IG_URI: {.      
4100: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4110: 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76  fig.bOpenUri = v
4120: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4140: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4150: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
4160: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20  ING_INDEX_SCAN: 
4170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
4180: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
4190: 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Cis = va_arg(ap,
41a0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
41b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
41c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
41d0: 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20  SQLLOG.    case 
41e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
41f0: 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79  LLOG: {.      ty
4200: 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c  pedef void(*SQLL
4210: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
4220: 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
4230: 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20   char*, int);.  
4240: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4250: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
4260: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c  = va_arg(ap, SQL
4270: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
4280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4290: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
42a0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
42b0: 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  id *);.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
42d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
42e0: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
42f0: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ZE: {.      sqli
4300: 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
4310: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
4320: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
4330: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
4340: 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 mxMmap = va_ar
4350: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
4360: 74 36 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t64);.      if( 
4370: 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d  mxMmap<0 || mxMm
4380: 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  ap>SQLITE_MAX_MM
4390: 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  AP_SIZE ){.     
43a0: 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49     mxMmap = SQLI
43b0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
43c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
43d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
43e0: 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d  fig.mxMmap = mxM
43f0: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73  map;.      if( s
4400: 7a 4d 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70  zMmap<0 ) szMmap
4410: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
4420: 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20  T_MMAP_SIZE;.   
4430: 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78     if( szMmap>mx
4440: 4d 6d 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d  Mmap) szMmap = m
4450: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
4460: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4470: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
4480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4490: 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
44a0: 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e  _OS_WIN && defin
44b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
44c0: 4d 41 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65  MALLOC).    case
44d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57   SQLITE_CONFIG_W
44e0: 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b  IN32_HEAPSIZE: {
44f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4500: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70  obalConfig.nHeap
4510: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4520: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
4530: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4540: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4550: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4560: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4570: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4580: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
4590: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
45a0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
45b0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
45c0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
45d0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
45e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
45f0: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
4600: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
4610: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
4620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4630: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
4640: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
4650: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4660: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
4670: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
4680: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
4690: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
46a0: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
46b0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
46c0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
46d0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
46e0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
46f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4700: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
4710: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4720: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
4730: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
4740: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
4750: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4770: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
4780: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4790: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
47a0: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
47b0: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
47c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
47d0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
47e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
47f0: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
4800: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
4810: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
4820: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
4830: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
4840: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
4850: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
4860: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
4870: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
4880: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
4890: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
48a0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
48b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
48c0: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
48d0: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
48e0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
48f0: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
4900: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
4910: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
4920: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
4930: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
4940: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
4950: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
4960: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
4970: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
4980: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
4990: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
49a0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
49b0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
49c0: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
49d0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
49e0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
49f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
4a00: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
4a10: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4a20: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4a30: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
4a40: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
4a50: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
4a60: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
4a70: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
4a80: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
4a90: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
4aa0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
4ab0: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
4ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
4ad0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
4ae0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4af0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
4b00: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4b10: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4b20: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4b30: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4b40: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4b50: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4b60: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4b70: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4b80: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4b90: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
4ba0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
4bb0: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
4bc0: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
4bd0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
4be0: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
4bf0: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
4c00: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4c10: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4c20: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4c30: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4c40: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4c50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4c60: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4c70: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4c80: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4c90: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
4ca0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
4cb0: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
4cc0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4cd0: 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20  Start = db;.    
4ce0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4cf0: 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  nd = db;.    db-
4d00: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
4d10: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
4d20: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4d30: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4d60: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4d70: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4d80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4d90: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4da0: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4db0: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
4dc0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
4dd0: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
4de0: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
4df0: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
4e00: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
4e10: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
4e20: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
4e30: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
4e40: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
4e50: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4e60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4e70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4e80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4e90: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4ea0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4eb0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
4ec0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
4ed0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
4ee0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
4ef0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
4f00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
4f10: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
4f20: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
4f30: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4f40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
4f50: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
4f60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4f70: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4f80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4f90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4fa0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4fb0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4fc0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4fd0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4fe0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4ff0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
5000: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
5010: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
5020: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
5030: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
5040: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
5050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
5060: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
5070: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
5080: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
5090: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
50a0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
50b0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
50c0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
50d0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
50e0: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
50f0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
5100: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5110: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
5120: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
5130: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
5140: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
5150: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
5160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5170: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5180: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
5190: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
51a0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
51b0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
51c0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
51d0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
51e0: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
51f0: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
5200: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
5210: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
5220: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
5230: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
5240: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
5250: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
5260: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
5270: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
5280: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
5290: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
52a0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
52b0: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
52c0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
52d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
52e0: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
52f0: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
5300: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5310: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
5320: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
5330: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
5340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
5350: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
5360: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
5370: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
5380: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
5390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
53a0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
53b0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
53c0: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
53e0: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
53f0: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
5400: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
5410: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
5420: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
5430: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
5440: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
5450: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
5460: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
5470: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
5480: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
5490: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
54a0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
54b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
54c0: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
54d0: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
54e0: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
54f0: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
5500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5510: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5520: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
5530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5550: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5560: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5570: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5580: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5590: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
55a0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
55b0: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
55c0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
55d0: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
55e0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
55f0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
5600: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
5610: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
5620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5630: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
5640: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
5650: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
5660: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
5670: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
5680: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
5690: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
56a0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
56b0: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
56c0: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
56d0: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
56e0: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
56f0: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
5700: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5710: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
5720: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
5730: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
5740: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
5750: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
5760: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5770: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
5780: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
5790: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
57a0: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
57b0: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
57c0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
57d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
57e0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
57f0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
5800: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
5810: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
5820: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
5830: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
5840: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
5850: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
5860: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
5870: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
5880: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
5890: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
58a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
58b0: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
58c0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
58d0: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
58e0: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
58f0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
5900: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
5910: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
5920: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
5930: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
5940: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
5950: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
5960: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
5970: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
5980: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
5990: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
59a0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
59b0: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
59c0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
59d0: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
59e0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
59f0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
5a00: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
5a10: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5a20: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
5a30: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
5a40: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
5a50: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
5a60: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
5a70: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
5a80: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
5a90: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
5aa0: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
5ab0: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
5ac0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
5ad0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
5ae0: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
5af0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
5b00: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
5b10: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
5b20: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
5b30: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
5b40: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
5b50: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
5b60: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
5b70: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
5b80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5b90: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
5ba0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5bb0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
5bc0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
5bd0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
5be0: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
5bf0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
5c00: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
5c10: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
5c20: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5c30: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5c40: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
5c50: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5c60: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5c70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5c80: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5c90: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5ca0: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5cb0: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
5cc0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
5cd0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
5ce0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
5cf0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
5d00: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
5d10: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
5d20: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
5d30: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
5d40: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
5d50: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5d60: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5d70: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5d80: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5d90: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5da0: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5db0: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
5dc0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
5dd0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
5de0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
5df0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
5e00: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
5e10: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
5e20: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
5e30: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
5e40: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
5e50: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5e60: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5e70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5e80: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5e90: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5ea0: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5eb0: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
5ec0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
5ed0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
5ee0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
5ef0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
5f00: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
5f10: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
5f20: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
5f30: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
5f40: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
5f50: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5f60: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5f70: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5f80: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5f90: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5fa0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5fb0: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5fc0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5fd0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5fe0: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5ff0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
6000: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
6010: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
6020: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
6030: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
6040: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
6050: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
6060: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
6070: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
6080: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
6090: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
60a0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65  ../*.** Disconne
60b0: 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76  ct all sqlite3_v
60c0: 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74  tab objects that
60d0: 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62   belong to datab
60e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
60f0: 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61  * db. This is ca
6100: 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20  lled when db is 
6110: 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f  being closed..*/
6120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
6130: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73  connectAllVtab(s
6140: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
6150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6160: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6170: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
6180: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
6190: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
61a0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
61b0: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
61c0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
61d0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
61e0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
61f0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73  ema ){.      Has
6200: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  hElem *p;.      
6210: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
6220: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
6230: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
6240: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
6250: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
6260: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
6270: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
6280: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
6290: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
62a0: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
62b0: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
62c0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
62d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
62e0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
62f0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
6300: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
6310: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
6320: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
6330: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6340: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
6350: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
6360: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
6370: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
6380: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6390: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
63a0: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
63b0: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
63c0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
63d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
63e0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
63f0: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
6400: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
6410: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
6420: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
6430: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6440: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
6450: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
6460: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
6470: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
6480: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6490: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
64a0: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
64b0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
64c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
64d0: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
64e0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
64f0: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
6500: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
6510: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6520: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
6530: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
6540: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
6550: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6560: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
6570: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6580: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6590: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
65a0: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
65b0: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
65c0: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
65d0: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
65e0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
65f0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
6600: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
6610: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
6620: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
6630: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
6640: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
6650: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
6660: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
6670: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
6680: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
6690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
66a0: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
66b0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
66c0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
66d0: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
66e0: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
66f0: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
6700: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
6710: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
6720: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
6730: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
6740: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
6750: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
6760: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
6770: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6780: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
6790: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
67a0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
67b0: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
67c0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
67d0: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
67e0: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
67f0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
6800: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
6810: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
6820: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
6830: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6840: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
6850: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
6860: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
6870: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
6880: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
6890: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
68a0: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
68b0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
68c0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
68d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
68e0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
68f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6900: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
6910: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
6920: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
6930: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20  .    /* Closing 
6940: 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72  the handle. Four
6950: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
6960: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
6970: 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   2. */.    sqlit
6980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
6990: 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c  Sqllog(sqlite3Gl
69a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
69b0: 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29  ogArg, db, 0, 2)
69c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
69d0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
69e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
69f0: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
6a00: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
6a10: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
6a20: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
6a30: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
6a40: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6a50: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
6a60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6a70: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
6a80: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
6a90: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
6aa0: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
6ab0: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
6ac0: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
6ad0: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
6ae0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
6af0: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
6b00: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
6b10: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
6b20: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
6b30: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6b40: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6b50: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6b60: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
6b70: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
6b80: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
6b90: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6ba0: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
6bb0: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
6bc0: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
6bd0: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
6be0: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
6bf0: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
6c00: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
6c10: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
6c20: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
6c30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6c40: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
6c50: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6c60: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
6c70: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
6c80: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
6c90: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6ca0: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
6cb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
6cc0: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
6cd0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6ce0: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
6cf0: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
6d00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6d10: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
6d20: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
6d30: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
6d40: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
6d50: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
6d60: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
6d70: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
6d80: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
6d90: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
6da0: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
6db0: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
6dc0: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
6dd0: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
6de0: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
6df0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
6e00: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6e10: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
6e20: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
6e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6e40: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
6e50: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
6e60: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
6e70: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
6e80: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
6e90: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
6ea0: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
6eb0: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
6ec0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
6ed0: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
6ee0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
6ef0: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
6f00: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
6f10: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
6f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
6f30: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
6f40: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
6f50: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
6f60: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
6f70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6f80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
6f90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
6fa0: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
6fb0: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
6fc0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
6fd0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
6fe0: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
6ff0: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
7000: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
7010: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
7020: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
7030: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  sed to sqlite3_c
7040: 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  lose (meaning th
7050: 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69  at it is a zombi
7060: 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a  e).  Therefore,.
7070: 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
7080: 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  d free all resou
7090: 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  rces..  */..  /*
70a0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
70b0: 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20  n is open, roll 
70c0: 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c  it back. This al
70d0: 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  so ensures that 
70e0: 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61  if.  ** any data
70f0: 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76  base schemas hav
7100: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
7110: 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65  by an uncommitte
7120: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d transaction.  
7130: 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65  ** they are rese
7140: 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  t. And that the 
7150: 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20  required b-tree 
7160: 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f  mutex is held to
7170: 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70   make.  ** the p
7180: 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ager rollback an
7190: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61  d schema reset a
71a0: 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69  n atomic operati
71b0: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
71c0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
71d0: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f  SQLITE_OK);..  /
71e0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
71f0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
7200: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
7210: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
7220: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
7230: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
7240: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7250: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
7260: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
7270: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
7280: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
7290: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
72a0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
72b0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
72c0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
72d0: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
72e0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
72f0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
7300: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
7310: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
7320: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
7330: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
7340: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
7350: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
7360: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
7370: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
7380: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
7390: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
73a0: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
73b0: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
73c0: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
73d0: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
73e0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
73f0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
7400: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
7410: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
7420: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
7430: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
7440: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
7450: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
7460: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
7470: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
7480: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
7490: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
74a0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
74b0: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
74c0: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
74d0: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
74e0: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
74f0: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
7500: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
7510: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
7520: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
7530: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
7540: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
7550: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
7560: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
7570: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
7580: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
7590: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
75a0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
75b0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
75c0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
75d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
75e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
75f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
7600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7610: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
7620: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7630: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
7640: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
7650: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
7660: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
7670: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
7680: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
7690: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
76a0: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
76b0: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
76c0: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
76d0: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
76e0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
76f0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
7700: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
7710: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
7720: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
7730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7740: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7750: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
7760: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
7770: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
7780: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
7790: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
77a0: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
77b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
77c0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
77d0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
77e0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
77f0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
7800: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
7810: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
7820: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
7830: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
7840: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
7850: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7860: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
7870: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
7880: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7890: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
78a0: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
78b0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
78c0: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
78d0: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
78e0: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
78f0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7900: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
7910: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
7920: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64  nsions(db);..  d
7930: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
7940: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a  E_MAGIC_ERROR;..
7950: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61    /* The temp-da
7960: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
7970: 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65   allocated diffe
7980: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
7990: 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  other schema.  *
79a0: 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67  * objects (using
79b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
79c0: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
79d0: 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  d of sqlite3Btre
79e0: 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a  eSchema())..  **
79f0: 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   So it needs to 
7a00: 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54  be freed here. T
7a10: 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c  odo: Why not rol
7a20: 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  l the temp schem
7a30: 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  a into.  ** the 
7a40: 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  same sqliteMallo
7a50: 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74  c() as the one t
7a60: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68  hat allocates th
7a70: 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a  e database .  **
7a80: 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f   structure?.  */
7a90: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7aa0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  (db, db->aDb[1].
7ab0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
7ac0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7ad0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
7ae0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7af0: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
7b00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
7b10: 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ree(db->mutex);.
7b20: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
7b30: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20  okaside.nOut==0 
7b40: 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20  );  /* Fails on 
7b50: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  a lookaside memo
7b60: 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28  ry leak */.  if(
7b70: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
7b80: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
7b90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
7ba0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
7bb0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
7bc0: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
7bd0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
7be0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
7bf0: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
7c00: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
7c10: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65   then.** any ope
7c20: 6e 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  n cursors are in
7c30: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
7c40: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
7c50: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
7c60: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
7c70: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
7c80: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
7c90: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
7ca0: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
7cb0: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
7cc0: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7cd0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
7ce0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74  lite3 *db, int t
7cf0: 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ripCode){.  int 
7d00: 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  i;.  int inTrans
7d10: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7d20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7d30: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
7d40: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
7d50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
7d60: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20    /* Obtain all 
7d70: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62  b-tree mutexes b
7d80: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79  efore making any
7d90: 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52   calls to BtreeR
7da0: 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a  ollback(). .  **
7db0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
7dc0: 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  nt in case the t
7dd0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
7de0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73   rolled back has
7df0: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
7e00: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
7e10: 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  ma. If the b-tre
7e20: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
7e30: 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72  t taken.  ** her
7e40: 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20  e, then another 
7e50: 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e  shared-cache con
7e60: 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e  nection might sn
7e70: 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20  eak in between. 
7e80: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
7e90: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
7ea0: 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63  hema reset, whic
7eb0: 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73  h can cause fals
7ec0: 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f  e.  ** corruptio
7ed0: 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d  n reports in som
7ee0: 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73  e cases.  */.  s
7ef0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7f00: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  All(db);..  for(
7f10: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7f20: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
7f30: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
7f40: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
7f50: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7f60: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7f70: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
7f80: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
7f90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7fa0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
7fb0: 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
7fc0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
7fd0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
7fe0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
7ff0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
8000: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
8010: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
8020: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
8030: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
8040: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
8050: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
8060: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
8070: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
8080: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
8090: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
80a0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
80b0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
80c0: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
80d0: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
80e0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
80f0: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
8100: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
8110: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
8120: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
8130: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
8140: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
8150: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
8160: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
8170: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
8180: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
8190: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
81a0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
81b0: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
81c0: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
81d0: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
81e0: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
81f0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
8200: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8210: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
8220: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
8230: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
8240: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
8250: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
8260: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
8270: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
8280: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
8290: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
82a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
82b0: 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53   \.    defined(S
82c0: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
82d0: 52 41 43 45 29 0a 63 6f 6e 73 74 20 63 68 61 72  RACE).const char
82e0: 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65   *sqlite3ErrName
82f0: 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73  (int rc){.  cons
8300: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
8310: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67  0;.  int i, orig
8320: 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69  Rc = rc;.  for(i
8330: 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65  =0; i<2 && zName
8340: 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20  ==0; i++, rc &= 
8350: 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63  0xff){.    switc
8360: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63  h( rc ){.      c
8370: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
8390: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f  Name = "SQLITE_O
83a0: 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  K";             
83b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
83c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
83d0: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
83e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
83f0: 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20  ERROR";         
8400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8410: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
8420: 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20  ERNAL:          
8430: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8440: 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20  _INTERNAL";     
8450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8460: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
8470: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
8480: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8490: 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20  E_PERM";        
84a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
84b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
84c0: 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20  BORT:           
84d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
84e0: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
84f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8500: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8510: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20  ABORT_ROLLBACK: 
8520: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8530: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
8540: 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  CK";    break;. 
8550: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8560: 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20  _BUSY:          
8570: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8580: 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20  LITE_BUSY";     
8590: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
85a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
85b0: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a  E_BUSY_RECOVERY:
85c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
85d0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
85e0: 45 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ERY";     break;
85f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8600: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
8610: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
8620: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
8630: 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  SHOT";     break
8640: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8650: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
8660: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8670: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b  "SQLITE_LOCKED";
8680: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8690: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
86a0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
86b0: 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d  EDCACHE: zName =
86c0: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f   "SQLITE_LOCKED_
86d0: 53 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65  SHAREDCACHE";bre
86e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
86f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
8700: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8710: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
8720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
8730: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8740: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
8750: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8760: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
8770: 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62  NLY";          b
8780: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8790: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
87a0: 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d  _RECOVERY:  zNam
87b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
87c0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
87d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
87e0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
87f0: 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61  Y_CANTLOCK:  zNa
8800: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
8810: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b  DONLY_CANTLOCK";
8820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8830: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
8840: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e  LY_ROLLBACK:  zN
8850: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
8860: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22  ADONLY_ROLLBACK"
8870: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
8880: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
8890: 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a  NLY_DBMOVED:   z
88a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
88b0: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22  EADONLY_DBMOVED"
88c0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
88d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
88e0: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
88f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8900: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20  INTERRUPT";     
8910: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8920: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8930: 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR:             
8940: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8950: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20  _IOERR";        
8960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8970: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8980: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
8990: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
89a0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20  E_IOERR_READ";  
89b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
89c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
89d0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a  OERR_SHORT_READ:
89e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
89f0: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
8a00: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
8a10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8a20: 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20  IOERR_WRITE:    
8a30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8a40: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22  ITE_IOERR_WRITE"
8a50: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8a60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8a70: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20  _IOERR_FSYNC:   
8a80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8a90: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
8aa0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
8ab0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8ac0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
8ad0: 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  C:    zName = "S
8ae0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
8af0: 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b  FSYNC";   break;
8b00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8b10: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
8b20: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
8b30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
8b40: 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b  NCATE";    break
8b50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8b60: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a  ITE_IOERR_FSTAT:
8b70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8b80: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
8b90: 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  TAT";       brea
8ba0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8bb0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
8bc0: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
8bd0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55   "SQLITE_IOERR_U
8be0: 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  NLOCK";      bre
8bf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8c00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
8c10: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
8c20: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8c30: 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  RDLOCK";      br
8c40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8c50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
8c60: 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ETE:       zName
8c70: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8c80: 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62  _DELETE";      b
8c90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8ca0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
8cb0: 4f 43 4b 45 44 3a 20 20 20 20 20 20 7a 4e 61 6d  OCKED:      zNam
8cc0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8cd0: 52 5f 42 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  R_BLOCKED";     
8ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8cf0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  e SQLITE_IOERR_N
8d00: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61  OMEM:        zNa
8d10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8d20: 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  RR_NOMEM";      
8d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8d40: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8d50: 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e  ACCESS:       zN
8d60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8d70: 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20  ERR_ACCESS";    
8d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8d90: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8da0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
8db0: 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK:.            
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8de0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
8df0: 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72  ESERVEDLOCK"; br
8e00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8e10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
8e20: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
8e30: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8e40: 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62  _LOCK";        b
8e50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8e60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
8e70: 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  OSE:        zNam
8e80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8e90: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20  R_CLOSE";       
8ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8eb0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
8ec0: 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61  IR_CLOSE:    zNa
8ed0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8ee0: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20  RR_DIR_CLOSE";  
8ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8f00: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8f10: 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e  SHMOPEN:      zN
8f20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8f30: 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20  ERR_SHMOPEN";   
8f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8f50: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8f60: 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a  _SHMSIZE:      z
8f70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8f80: 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20  OERR_SHMSIZE";  
8f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8fa0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8fb0: 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20  R_SHMLOCK:      
8fc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8fd0: 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20  IOERR_SHMLOCK"; 
8fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8ff0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
9000: 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20  RR_SHMMAP:      
9010: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9020: 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20  _IOERR_SHMMAP"; 
9030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9040: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
9050: 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20  ERR_SEEK:       
9060: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9070: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20  E_IOERR_SEEK";  
9080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9090: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
90a0: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
90b0: 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  T: zName = "SQLI
90c0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
90d0: 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20  NOENT";break;.  
90e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
90f0: 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20  IOERR_MMAP:     
9100: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9110: 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b  ITE_IOERR_MMAP";
9120: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9130: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9140: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
9150: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
9160: 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
9170: 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  MPPATH"; break;.
9180: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9190: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
91a0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
91b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
91c0: 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b  PATH";    break;
91d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
91e0: 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20  TE_CORRUPT:     
91f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9200: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b  SQLITE_CORRUPT";
9210: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9220: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9230: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
9240: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
9250: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  "SQLITE_CORRUPT_
9260: 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61  VTAB";      brea
9270: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9280: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20  LITE_NOTFOUND:  
9290: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
92a0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e   "SQLITE_NOTFOUN
92b0: 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  D";          bre
92c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
92d0: 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20  QLITE_FULL:     
92e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
92f0: 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b  = "SQLITE_FULL";
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
9310: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9320: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a  SQLITE_CANTOPEN:
9330: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9340: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
9350: 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62  PEN";          b
9360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9370: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9380: 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d  _NOTEMPDIR: zNam
9390: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
93a0: 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b  OPEN_NOTEMPDIR";
93b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
93c0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
93d0: 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61  N_ISDIR:     zNa
93e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
93f0: 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20  TOPEN_ISDIR";   
9400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9410: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
9420: 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e  EN_FULLPATH:  zN
9430: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
9440: 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22  NTOPEN_FULLPATH"
9450: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9460: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
9470: 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a  PEN_CONVPATH:  z
9480: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9490: 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
94a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
94b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54  case SQLITE_PROT
94c0: 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20  OCOL:           
94d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
94e0: 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20  PROTOCOL";      
94f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9500: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50   case SQLITE_EMP
9510: 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TY:             
9520: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9530: 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20  _EMPTY";        
9540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9550: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43    case SQLITE_SC
9560: 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20  HEMA:           
9570: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9580: 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20  E_SCHEMA";      
9590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
95a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
95b0: 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20  OOBIG:          
95c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
95d0: 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20  TE_TOOBIG";     
95e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
95f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9600: 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20  CONSTRAINT:     
9610: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9620: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b  ITE_CONSTRAINT";
9630: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9640: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9650: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
9660: 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  UE:  zName = "SQ
9670: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9680: 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a  UNIQUE"; break;.
9690: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
96a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
96b0: 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  GGER: zName = "S
96c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
96d0: 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b  _TRIGGER";break;
96e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
96f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
9700: 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20  REIGNKEY:.      
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9730: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9740: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22  AINT_FOREIGNKEY"
9750: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9760: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9770: 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20  STRAINT_CHECK:  
9780: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9790: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43  _CONSTRAINT_CHEC
97a0: 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  K";  break;.    
97b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
97c0: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
97d0: 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20  KEY:.           
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9800: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9810: 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62  PRIMARYKEY";   b
9820: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9830: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9840: 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d  NT_NOTNULL: zNam
9850: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
9860: 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b  TRAINT_NOTNULL";
9870: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9880: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9890: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a  INT_COMMITHOOK:.
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
98d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
98e0: 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b  THOOK";   break;
98f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9900: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54  TE_CONSTRAINT_VT
9910: 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  AB:    zName = "
9920: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9930: 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b  T_VTAB";   break
9940: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9950: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
9960: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20  UNCTION:.       
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9990: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
99a0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20  INT_FUNCTION";  
99b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
99c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
99d0: 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20  TRAINT_ROWID:   
99e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
99f0: 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44  CONSTRAINT_ROWID
9a00: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
9a10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
9a20: 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20  MATCH:          
9a30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a40: 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20  _MISMATCH";     
9a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
9a70: 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20  SUSE:           
9a80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9a90: 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20  E_MISUSE";      
9aa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9ab0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
9ac0: 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20  OLFS:           
9ad0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9ae0: 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20  TE_NOLFS";      
9af0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9b00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9b10: 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20  AUTH:           
9b20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9b30: 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20  ITE_AUTH";      
9b40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9b50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9b60: 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20  _FORMAT:        
9b70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9b80: 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20  LITE_FORMAT";   
9b90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9ba0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9bb0: 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20  E_RANGE:        
9bc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9bd0: 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20  QLITE_RANGE";   
9be0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9bf0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9c00: 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20  TE_NOTADB:      
9c10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9c20: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20  SQLITE_NOTADB"; 
9c30: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9c40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9c50: 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20  ITE_ROW:        
9c60: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9c70: 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20  "SQLITE_ROW";   
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9c90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9ca0: 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20  LITE_NOTICE:    
9cb0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9cc0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22   "SQLITE_NOTICE"
9cd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
9ce0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9cf0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
9d00: 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20  OVER_WAL: zName 
9d10: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
9d20: 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72  _RECOVER_WAL";br
9d30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9d40: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9d50: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a  COVER_ROLLBACK:.
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9d90: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
9da0: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
9db0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9dc0: 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20  TE_WARNING:     
9dd0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9de0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b  SQLITE_WARNING";
9df0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9e00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9e10: 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f  ITE_WARNING_AUTO
9e20: 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20  INDEX:  zName = 
9e30: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  "SQLITE_WARNING_
9e40: 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61  AUTOINDEX"; brea
9e50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9e60: 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20  LITE_DONE:      
9e70: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9e80: 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20   "SQLITE_DONE"; 
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9ea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
9eb0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
9ec0: 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
9ed0: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71  zBuf[50];.    sq
9ee0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
9ef0: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
9f00: 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f  f, "SQLITE_UNKNO
9f10: 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29  WN(%d)", origRc)
9f20: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42  ;.    zName = zB
9f30: 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  uf;.  }.  return
9f40: 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
9f50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
9f60: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74   static string t
9f70: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
9f80: 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
9f90: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
9fa0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
9fb0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
9fc0: 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72  ite3ErrStr(int r
9fd0: 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  c){.  static con
9fe0: 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61  st char* const a
9ff0: 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  Msg[] = {.    /*
a000: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
a010: 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65      */ "not an e
a020: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
a030: 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20  LITE_ERROR      
a040: 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65   */ "SQL logic e
a050: 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20  rror or missing 
a060: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
a070: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  * SQLITE_INTERNA
a080: 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f  L    */ 0,.    /
a090: 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20  * SQLITE_PERM   
a0a0: 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20       */ "access 
a0b0: 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65  permission denie
a0c0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a0d0: 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f  E_ABORT       */
a0e0: 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65   "callback reque
a0f0: 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74  sted query abort
a100: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a110: 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20  _BUSY        */ 
a120: 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  "database is loc
a130: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
a140: 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  ITE_LOCKED      
a150: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62  */ "database tab
a160: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  le is locked",. 
a170: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d     /* SQLITE_NOM
a180: 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74  EM       */ "out
a190: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20   of memory",.   
a1a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f   /* SQLITE_READO
a1b0: 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d  NLY    */ "attem
a1c0: 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65  pt to write a re
a1d0: 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22  adonly database"
a1e0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a1f0: 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22  INTERRUPT   */ "
a200: 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20  interrupted",.  
a210: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52    /* SQLITE_IOER
a220: 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b  R       */ "disk
a230: 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20   I/O error",.   
a240: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   /* SQLITE_CORRU
a250: 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  PT     */ "datab
a260: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
a270: 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20  s malformed",.  
a280: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46    /* SQLITE_NOTF
a290: 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e  OUND    */ "unkn
a2a0: 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a  own operation",.
a2b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55      /* SQLITE_FU
a2c0: 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  LL        */ "da
a2d0: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
a2e0: 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20  s full",.    /* 
a2f0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
a300: 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f     */ "unable to
a310: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
a320: 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ile",.    /* SQL
a330: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20  ITE_PROTOCOL    
a340: 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  */ "locking prot
a350: 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ocol",.    /* SQ
a360: 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20  LITE_EMPTY      
a370: 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61   */ "table conta
a380: 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20  ins no data",.  
a390: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45    /* SQLITE_SCHE
a3a0: 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  MA      */ "data
a3b0: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
a3c0: 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a  changed",.    /*
a3d0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20   SQLITE_TOOBIG  
a3e0: 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f      */ "string o
a3f0: 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c  r blob too big",
a400: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
a410: 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63  ONSTRAINT  */ "c
a420: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
a430: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a440: 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20  _MISMATCH    */ 
a450: 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  "datatype mismat
a460: 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ch",.    /* SQLI
a470: 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a  TE_MISUSE      *
a480: 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69  / "library routi
a490: 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66  ne called out of
a4a0: 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20   sequence",.    
a4b0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20  /* SQLITE_NOLFS 
a4c0: 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20        */ "large 
a4d0: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20  file support is 
a4e0: 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f  disabled",.    /
a4f0: 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20  * SQLITE_AUTH   
a500: 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69       */ "authori
a510: 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  zation denied",.
a520: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
a530: 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75  RMAT      */ "au
a540: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
a550: 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a   format error",.
a560: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41      /* SQLITE_RA
a570: 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69  NGE       */ "bi
a580: 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64  nd or column ind
a590: 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22  ex out of range"
a5a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a5b0: 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22  NOTADB      */ "
a5c0: 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65  file is encrypte
a5d0: 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61  d or is not a da
a5e0: 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20  tabase",.  };.  
a5f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
a600: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f   = "unknown erro
a610: 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63  r";.  switch( rc
a620: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
a630: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
a640: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72  CK: {.      zErr
a650: 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f   = "abort due to
a660: 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20   ROLLBACK";.    
a670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a680: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
a690: 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a      rc &= 0xff;.
a6a0: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
a6b0: 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72  (rc>=0) && rc<Ar
a6c0: 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26  raySize(aMsg) &&
a6d0: 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a   aMsg[rc]!=0 ){.
a6e0: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61          zErr = a
a6f0: 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d  Msg[rc];.      }
a700: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a710: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a720: 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zErr;.}../*.** 
a730: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
a740: 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63  lements a busy c
a750: 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65  allback that sle
a760: 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a  eps and tries.**
a770: 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74   again until a t
a780: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20  imeout value is 
a790: 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69  reached.  The ti
a7a0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a  meout value is.*
a7b0: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  * an integer num
a7c0: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
a7d0: 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73  nds passed in as
a7e0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
a7f0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
a800: 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61  c int sqliteDefa
a810: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28  ultBusyCallback(
a820: 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20  . void *ptr,    
a830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
a840: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a850: 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20  n */. int count 
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a870: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
a880: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
a890: 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20   busy */.){.#if 
a8a0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c  SQLITE_OS_WIN ||
a8b0: 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55   (defined(HAVE_U
a8c0: 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
a8d0: 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20  SLEEP).  static 
a8e0: 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b  const u8 delays[
a8f0: 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c  ] =.     { 1, 2,
a900: 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20   5, 10, 15, 20, 
a910: 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30  25, 25,  25,  50
a920: 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20  ,  50, 100 };.  
a930: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
a940: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
a950: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
a960: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
a970: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
a980: 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44  8 };.# define ND
a990: 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64  ELAY ArraySize(d
a9a0: 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33  elays).  sqlite3
a9b0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
a9c0: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
a9d0: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
a9e0: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
a9f0: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
aa00: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
aa10: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
aa20: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
aa30: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
aa40: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
aa50: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
aa60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
aa70: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
aa80: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
aa90: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
aaa0: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
aab0: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
aac0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
aad0: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
aae0: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
aaf0: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
ab00: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
ab10: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
ab20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
ab30: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
ab40: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
ab50: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
ab60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
ab70: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
ab80: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
ab90: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
aba0: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
abb0: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
abc0: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
abd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
abe0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
abf0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
ac00: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
ac10: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ac20: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
ac30: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
ac40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ac50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
ac60: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
ac70: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
ac80: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
ac90: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
aca0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
acb0: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
acc0: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
acd0: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
ace0: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
acf0: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
ad00: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
ad10: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
ad20: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
ad30: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
ad40: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
ad50: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
ad60: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
ad70: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
ad80: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
ad90: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
ada0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
adb0: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
adc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
add0: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
ade0: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
adf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ae00: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
ae10: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
ae20: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
ae30: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
ae40: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
ae50: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
ae60: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
ae70: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
ae80: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
ae90: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
aea0: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
aeb0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
aec0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aed0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
aee0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
aef0: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
af00: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
af10: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
af20: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
af30: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
af40: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
af50: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
af60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
af70: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
af80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
af90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
afa0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
afb0: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
afc0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
afd0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
afe0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
aff0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
b000: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
b010: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
b020: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
b030: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
b040: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
b050: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
b060: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
b070: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b080: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
b090: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
b0a0: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
b0b0: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
b0c0: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
b0d0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71  id *pArg.){.  sq
b0e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
b0f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
b100: 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20  if( nOps>0 ){.  
b110: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
b120: 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20  = xProgress;.   
b130: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
b140: 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f  s = (unsigned)nO
b150: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
b160: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
b170: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
b180: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
b190: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
b1a0: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
b1b0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
b1c0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
b1d0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
b1e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
b1f0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
b200: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
b210: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
b220: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
b230: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
b240: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
b250: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
b260: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
b270: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
b280: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
b290: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
b2a0: 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30   ms){.  if( ms>0
b2b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b2c0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
b2d0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
b2e0: 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  syCallback, (voi
b2f0: 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e  d*)db);.    db->
b300: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73  busyTimeout = ms
b310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
b320: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
b330: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
b340: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
b350: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b360: 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e  Cause any pendin
b370: 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73  g operation to s
b380: 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69  top at its earli
b390: 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  est opportunity.
b3a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b3b0: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
b3c0: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75  e3 *db){.  db->u
b3d0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
b3e0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
b3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b400: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
b410: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
b420: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
b430: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
b440: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
b450: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
b460: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
b470: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
b480: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
b490: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
b4a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
b4b0: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
b4c0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
b4d0: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
b4e0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
b4f0: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
b500: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
b510: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
b520: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b530: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
b540: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
b550: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
b560: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
b570: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
b580: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
b590: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
b5a0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
b5b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
b5c0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
b5d0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
b5e0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
b5f0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
b600: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
b610: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
b620: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
b630: 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65  t nName;.  int e
b640: 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73  xtraFlags;..  as
b650: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b660: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
b670: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75  ex) );.  if( zFu
b680: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c  nctionName==0 ||
b690: 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26 26  .      (xFunc &&
b6a0: 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65   (xFinal || xSte
b6b0: 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21  p)) || .      (!
b6c0: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
b6d0: 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a   && !xStep)) ||.
b6e0: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
b6f0: 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74   (!xFinal && xSt
b700: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e  ep)) ||.      (n
b710: 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53  Arg<-1 || nArg>S
b720: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
b730: 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20  ON_ARG) ||.     
b740: 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73   (255<(nName = s
b750: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20  qlite3Strlen30( 
b760: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29  zFunctionName)))
b770: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
b780: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
b790: 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  T;.  }..  assert
b7a0: 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  ( SQLITE_FUNC_CO
b7b0: 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44  NSTANT==SQLITE_D
b7c0: 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a  ETERMINISTIC );.
b7d0: 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65    extraFlags = e
b7e0: 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54  nc &  SQLITE_DET
b7f0: 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e  ERMINISTIC;.  en
b800: 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e  c &= (SQLITE_FUN
b810: 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45  C_ENCMASK|SQLITE
b820: 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65  _ANY);.  .#ifnde
b830: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
b840: 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  F16.  /* If SQLI
b850: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
b860: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
b870: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
b880: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
b890: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
b8a0: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
b8b0: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
b8c0: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
b8d0: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
b8e0: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
b8f0: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
b900: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ernally..  **.  
b910: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59  ** If SQLITE_ANY
b920: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61   is specified, a
b930: 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e  dd three version
b940: 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  s of the functio
b950: 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61  n.  ** to the ha
b960: 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  sh table..  */. 
b970: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
b980: 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e  _UTF16 ){.    en
b990: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
b9a0: 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20  NATIVE;.  }else 
b9b0: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
b9c0: 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ANY ){.    int r
b9d0: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
b9e0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
b9f0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
ba00: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
ba10: 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  F8|extraFlags,. 
ba20: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
ba30: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
ba40: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
ba50: 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ctor);.    if( r
ba60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ba70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ba80: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
ba90: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
baa0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
bab0: 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c  16LE|extraFlags,
bac0: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
bad0: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
bae0: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
baf0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
bb00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bb10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
bb20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
bb30: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
bb40: 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65  _UTF16BE;.  }.#e
bb50: 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49  lse.  enc = SQLI
bb60: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
bb70: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
bb80: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e   an existing fun
bb90: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f  ction is being o
bba0: 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c  verridden or del
bbb0: 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a  eted. If so,.  *
bbc0: 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
bbd0: 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e  active VMs, then
bbe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
bbf0: 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69  USY. If a functi
bc00: 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  on.  ** is being
bc10: 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65   overridden/dele
bc20: 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72  ted but there ar
bc30: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
bc40: 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20   allow the.  ** 
bc50: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  operation to con
bc60: 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69  tinue but invali
bc70: 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70  date all precomp
bc80: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
bc90: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
bca0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
bcb0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
bcc0: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
bcd0: 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69  (u8)enc, 0);.  i
bce0: 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63  f( p && (p->func
bcf0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
bd00: 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e  UNC_ENCMASK)==en
bd10: 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41  c && p->nArg==nA
bd20: 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  rg ){.    if( db
bd30: 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
bd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
bd50: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
bd60: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
bd70: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
bd80: 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63  modify user-func
bd90: 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69  tion due to acti
bda0: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
bdb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
bdc0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bdd0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
bde0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
bdf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
be00: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
be10: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
be20: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
be30: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
be40: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
be50: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d  nctionName, nNam
be60: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
be70: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
be80: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
be90: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
bea0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
beb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
bec0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65  .  /* If an olde
bed0: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  r version of the
bee0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61   function with a
bef0: 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74   configured dest
bf00: 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62  ructor is.  ** b
bf10: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e  eing replaced in
bf20: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
bf30: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  tor function her
bf40: 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e  e. */.  function
bf50: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
bf60: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
bf70: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
bf80: 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  uctor->nRef++;. 
bf90: 20 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63   }.  p->pDestruc
bfa0: 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f  tor = pDestructo
bfb0: 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67  r;.  p->funcFlag
bfc0: 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67  s = (p->funcFlag
bfd0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
bfe0: 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61  ENCMASK) | extra
bff0: 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73  Flags;.  testcas
c000: 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  e( p->funcFlags 
c010: 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  & SQLITE_DETERMI
c020: 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78  NISTIC );.  p->x
c030: 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20  Func = xFunc;.  
c040: 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70  p->xStep = xStep
c050: 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65  ;.  p->xFinalize
c060: 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e   = xFinal;.  p->
c070: 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65  pUserData = pUse
c080: 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67  rData;.  p->nArg
c090: 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20   = (u16)nArg;.  
c0a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c0b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
c0c0: 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74  e new user funct
c0d0: 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
c0e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
c0f0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
c100: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
c110: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
c120: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
c130: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
c140: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
c150: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c160: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
c170: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
c180: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
c190: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
c1a0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
c1b0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
c1c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
c1d0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
c1e0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
c1f0: 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c  on_v2(db, zFunc,
c200: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
c210: 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20  Func, xStep,.   
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a   xFinal, 0);.}..
c250: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
c260: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a  te_function_v2(.
c270: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
c280: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
c290: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
c2a0: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
c2b0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
c2c0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
c2d0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c2e0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
c2f0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
c300: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c310: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c320: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
c330: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
c340: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
c350: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
c360: 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d *).){.  int rc
c370: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
c380: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
c390: 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73  r *pArg = 0;.  s
c3a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
c3b0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
c3c0: 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b   if( xDestroy ){
c3d0: 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e  .    pArg = (Fun
c3e0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71  cDestructor *)sq
c3f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c400: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e  o(db, sizeof(Fun
c410: 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20  cDestructor));. 
c420: 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a     if( !pArg ){.
c430: 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70        xDestroy(p
c440: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75  );.      goto ou
c450: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  t;.    }.    pAr
c460: 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44  g->xDestroy = xD
c470: 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67  estroy;.    pArg
c480: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b  ->pUserData = p;
c490: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
c4a0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
c4b0: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
c4c0: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
c4d0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72  tep, xFinal, pAr
c4e0: 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26  g);.  if( pArg &
c4f0: 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20  & pArg->nRef==0 
c500: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
c510: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
c520: 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b      xDestroy(p);
c530: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
c540: 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20  ee(db, pArg);.  
c550: 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20  }.. out:.  rc = 
c560: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
c570: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
c580: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
c590: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
c5a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
c5b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
c5c0: 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  F16.int sqlite3_
c5d0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
c5e0: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
c5f0: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
c600: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
c610: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
c620: 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69   eTextRep,.  voi
c630: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
c640: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
c650: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c660: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
c670: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
c680: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
c690: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
c6a0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
c6b0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
c6c0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  text*).){.  int 
c6d0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e  rc;.  char *zFun
c6e0: 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c8;.  sqlite3_mu
c6f0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
c700: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
c710: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
c720: 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20  d );.  zFunc8 = 
c730: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
c740: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
c750: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
c760: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63  F16NATIVE);.  rc
c770: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
c780: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
c790: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
c7a0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
c7b0: 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73  , xFinal,0);.  s
c7c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c7d0: 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
c7e0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
c7f0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
c800: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
c810: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
c820: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
c830: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  .../*.** Declare
c840: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
c850: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f   has been overlo
c860: 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61  aded by a virtua
c870: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
c880: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61  f the function a
c890: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73  lready exists as
c8a0: 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61   a regular globa
c8b0: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  l function, then
c8c0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
c8d0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
c8e0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
c8f0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
c900: 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e  en create.** a n
c910: 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61  ew one that alwa
c920: 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d  ys throws a run-
c930: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a  time error.  .**
c940: 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c  .** When virtual
c950: 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74   tables intend t
c960: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65  o provide an ove
c970: 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e  rloaded function
c980: 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  , they.** should
c990: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
c9a0: 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
c9b0: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
c9c0: 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41  ion exists..** A
c9d0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
c9e0: 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f   must exist in o
c9f0: 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65  rder for name re
ca00: 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  solution to work
ca10: 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  .** properly..*/
ca20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65  .int sqlite3_ove
ca30: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a  rload_function(.
ca40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
ca50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ca60: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29  me,.  int nArg.)
ca70: 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  {.  int nName = 
ca80: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ca90: 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63  zName);.  int rc
caa0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
cab0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
cac0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
cad0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
cae0: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
caf0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
cb00: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
cb10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
cb20: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
cb30: 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  nc(db, zName, nA
cb40: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
cb50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
cb70: 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
cb80: 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  ction, 0, 0, 0);
cb90: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
cba0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
cbb0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
cbc0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
cbd0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
cbe0: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
cbf0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
cc00: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
cc10: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e   trace function.
cc20: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
cc30: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
cc40: 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a  egistered trace.
cc50: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
cc60: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74   .**.** A NULL t
cc70: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  race function me
cc80: 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63  ans that no trac
cc90: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
cca0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
ccb0: 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74  trace is a point
ccc0: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
ccd0: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
cce0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
ccf0: 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61   each.** SQL sta
cd00: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
cd10: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
cd20: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
cd30: 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a   (*xTrace)(void*
cd40: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
cd50: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
cd60: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
cd70: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
cd80: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
cd90: 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41  ld = db->pTraceA
cda0: 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65  rg;.  db->xTrace
cdb0: 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d   = xTrace;.  db-
cdc0: 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
cdd0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
cde0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cdf0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
ce00: 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ld;.}./*.** Regi
ce10: 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66  ster a profile f
ce20: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
ce30: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
ce40: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
ce50: 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75  d .** profile fu
ce60: 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  nction is return
ce70: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
ce80: 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  LL profile funct
ce90: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
cea0: 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65  o profiling is e
ceb0: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
cec0: 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  NULL.** profile 
ced0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
cee0: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
cef0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
cf00: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a  e conclusion of.
cf10: 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ** each SQL stat
cf20: 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75  ement that is ru
cf30: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
cf40: 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73  te3_profile(.  s
cf50: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
cf60: 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76  id (*xProfile)(v
cf70: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
cf80: 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c  ,sqlite_uint64),
cf90: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
cfa0: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
cfb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
cfc0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
cfd0: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50  .  pOld = db->pP
cfe0: 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d  rofileArg;.  db-
cff0: 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f  >xProfile = xPro
d000: 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f  file;.  db->pPro
d010: 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  fileArg = pArg;.
d020: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d030: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d040: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
d050: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d060: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
d070: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
d080: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r a function to 
d090: 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20  be invoked when 
d0a0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  a transaction co
d0b0: 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65  mmits..** If the
d0c0: 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f   invoked functio
d0d0: 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
d0e0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d  ro, then the com
d0f0: 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a  mit becomes a.**
d100: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f   rollback..*/.vo
d110: 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d  id *sqlite3_comm
d120: 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  it_hook(.  sqlit
d130: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
d140: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
d150: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
d160: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
d170: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
d180: 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74  oid*),  /* Funct
d190: 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e  ion to invoke on
d1a0: 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a   each commit */.
d1b0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d1d0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
d1e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
d1f0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
d200: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d210: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d220: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
d230: 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
d240: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
d250: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
d260: 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
d270: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
d280: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d290: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
d2a0: 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
d2b0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
d2c0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
d2d0: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
d2e0: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
d2f0: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
d300: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
d310: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d320: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
d330: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
d340: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
d350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d360: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
d370: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
d380: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
d390: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
d3a0: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
d3b0: 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
d3c0: 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
d3d0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
d3e0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
d3f0: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
d400: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
d410: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
d420: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
d430: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
d440: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
d450: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
d460: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d470: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
d480: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
d490: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d4a0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d4b0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
d4c0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d4d0: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
d4e0: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
d4f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
d500: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
d510: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
d520: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
d530: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
d540: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
d550: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
d560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d570: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
d580: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
d590: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
d5a0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
d5b0: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
d5c0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
d5d0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
d5e0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
d5f0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
d600: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
d610: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
d620: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d630: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
d640: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a  ->pRollbackArg;.
d650: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
d660: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
d670: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c  ack;.  db->pRoll
d680: 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a  backArg = pArg;.
d690: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d6a0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d6b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
d6c0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
d6d0: 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
d6e0: 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65  TE_HOOK./*.** Re
d6f0: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
d700: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
d710: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
d720: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
d730: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
d740: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
d750: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d760: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
d770: 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f  te3_preupdate_ho
d780: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
d790: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
d7a0: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
d7b0: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
d7c0: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78  ase */.  void(*x
d7d0: 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20 20  Callback)(      
d7e0: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
d7f0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76  unction */.    v
d800: 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
d810: 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68  t,char const*,ch
d820: 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65  ar const*,sqlite
d830: 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f  3_int64,sqlite3_
d840: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
d850: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
d860: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c      /* First cal
d870: 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a  lback argument *
d880: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
d890: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
d8a0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d8b0: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
d8c0: 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 3b  ->pPreUpdateArg;
d8d0: 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74  .  db->xPreUpdat
d8e0: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  eCallback = xCal
d8f0: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72  lback;.  db->pPr
d900: 65 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  eUpdateArg = pAr
d910: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
d920: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d930: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
d940: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
d950: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
d960: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
d970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d980: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
d990: 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  he sqlite3_wal_h
d9a0: 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72  ook() callback r
d9b0: 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c  egistered by sql
d9c0: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
d9d0: 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e  ckpoint()..** In
d9e0: 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c  voke sqlite3_wal
d9f0: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74  _checkpoint if t
da00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
da10: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
da20: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
da30: 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70  r than sqlite3.p
da40: 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61  WalArg cast to a
da50: 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76  n integer (the v
da60: 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
da70: 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68  by.** wal_autoch
da80: 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20  eckpoint())..*/ 
da90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44  .int sqlite3WalD
daa0: 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f  efaultHook(.  vo
dab0: 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c  id *pClientData,
dac0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
dad0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
dae0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b,           /* 
daf0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  Connection */.  
db00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
db10: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
db20: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61  se */.  int nFra
db30: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  me             /
db40: 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f  * Size of WAL */
db50: 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  .){.  if( nFrame
db60: 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  >=SQLITE_PTR_TO_
db70: 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29  INT(pClientData)
db80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
db90: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
dba0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
dbb0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64  wal_checkpoint(d
dbc0: 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c  b, zDb);.    sql
dbd0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
dbe0: 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  loc();.  }.  ret
dbf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dc00: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
dc10: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
dc20: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61  *.** Configure a
dc30: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  n sqlite3_wal_ho
dc40: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ok() callback to
dc50: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
dc60: 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64  heckpoint.** a d
dc70: 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f  atabase after co
dc80: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
dc90: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
dca0: 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a  are nFrame or.**
dcb0: 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20   more frames in 
dcc0: 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61  the log file. Pa
dcd0: 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20  ssing zero or a 
dce0: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61  negative value a
dcf0: 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20  s the.** nFrame 
dd00: 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c  parameter disabl
dd10: 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  es automatic che
dd20: 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c  ckpoints entirel
dd30: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
dd40: 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
dd50: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
dd60: 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65  n replaces any e
dd70: 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b  xisting callback
dd80: 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75  .** registered u
dd90: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
dda0: 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73  _hook(). Likewis
ddb0: 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61  e, registering a
ddc0: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69   callback.** usi
ddd0: 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
dde0: 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74  ook() disables t
ddf0: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  he automatic che
de00: 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73  ckpoint mechanis
de10: 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  m.** configured 
de20: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
de30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
de40: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
de50: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
de60: 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69   int nFrame){.#i
de70: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
de80: 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41  _WAL.  UNUSED_PA
de90: 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
dea0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
deb0: 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20  nFrame);.#else. 
dec0: 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b   if( nFrame>0 ){
ded0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
dee0: 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65  _hook(db, sqlite
def0: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c  3WalDefaultHook,
df00: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
df10: 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d  TR(nFrame));.  }
df20: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
df30: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30  3_wal_hook(db, 0
df40: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
df50: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
df60: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
df70: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
df80: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
df90: 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
dfa0: 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74  saction is writt
dfb0: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77  en.** into the w
dfc0: 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62  rite-ahead-log b
dfd0: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
dfe0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
dff0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c  oid *sqlite3_wal
e000: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
e010: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
e020: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
e030: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
e040: 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  his db handle */
e050: 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63  .  int(*xCallbac
e060: 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74  k)(void *, sqlit
e070: 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  e3*, const char*
e080: 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  , int),.  void *
e090: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
e0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
e0b0: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
e0c0: 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28  ed to xCallback(
e0d0: 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  ) */.){.#ifndef 
e0e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
e0f0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
e100: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e110: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e120: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61    pRet = db->pWa
e130: 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c  lArg;.  db->xWal
e140: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
e150: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c  back;.  db->pWal
e160: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
e170: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e180: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
e190: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c  return pRet;.#el
e1a0: 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
e1b0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
e1c0: 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
e1d0: 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73  se zDb..*/.int s
e1e0: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
e1f0: 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69  point_v2(.  sqli
e200: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
e210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
e220: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
e230: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e240: 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
e250: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
e260: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
e270: 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
e280: 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20  int eMode,      
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  /* SQLITE_CHECKP
e2b0: 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a  OINT_* value */.
e2c0: 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20    int *pnLog,   
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
e2f0: 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61  f WAL log in fra
e300: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
e310: 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20  Ckpt            
e320: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
e330: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
e340: 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69   frames checkpoi
e350: 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  nted */.){.#ifde
e360: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
e370: 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  L.  return SQLIT
e380: 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  E_OK;.#else.  in
e390: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e3b0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
e3c0: 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49    int iDb = SQLI
e3d0: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b  TE_MAX_ATTACHED;
e3e0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62    /* sqlite3.aDb
e3f0: 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74  [] index of db t
e400: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  o checkpoint */.
e410: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
e420: 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
e430: 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63  ables to -1 in c
e440: 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
e450: 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e  urs. */.  if( pn
e460: 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d  Log ) *pnLog = -
e470: 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20  1;.  if( pnCkpt 
e480: 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a  ) *pnCkpt = -1;.
e490: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
e4a0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
e4b0: 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  L>SQLITE_CHECKPO
e4c0: 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b 0a 20  INT_PASSIVE );. 
e4d0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
e4e0: 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c  CHECKPOINT_FULL<
e4f0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
e500: 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 61  T_RESTART );.  a
e510: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
e520: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
e530: 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b  +2==SQLITE_CHECK
e540: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b  POINT_RESTART );
e550: 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c  .  if( eMode<SQL
e560: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
e570: 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e  ASSIVE || eMode>
e580: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
e590: 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20 20 20  T_RESTART ){.   
e5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
e5b0: 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  ISUSE;.  }..  sq
e5c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e5d0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e5e0: 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
e5f0: 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
e600: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
e610: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
e620: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
e630: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
e640: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
e650: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
e660: 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e  _ERROR, "unknown
e670: 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20   database: %s", 
e680: 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  zDb);.  }else{. 
e690: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
e6a0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44  heckpoint(db, iD
e6b0: 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  b, eMode, pnLog,
e6c0: 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71   pnCkpt);.    sq
e6d0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
e6e0: 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  c, 0);.  }.  rc 
e6f0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
e700: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
e710: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e720: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
e730: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
e740: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  }.../*.** Checkp
e750: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
e760: 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c  b. If zDb is NUL
e770: 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66  L, or if the buf
e780: 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a  fer zDb points.*
e790: 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20  * to contains a 
e7a0: 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69  zero-length stri
e7b0: 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64  ng, all attached
e7c0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a   databases are .
e7d0: 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
e7e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e7f0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73  wal_checkpoint(s
e800: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
e810: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
e820: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77  return sqlite3_w
e830: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
e840: 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
e850: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
e860: 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23  IVE, 0, 0);.}..#
e870: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e880: 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e  IT_WAL./*.** Run
e890: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e   a checkpoint on
e8a0: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54   database iDb. T
e8b0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
e8c0: 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69  f database iDb i
e8d0: 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74  s.** not current
e8e0: 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d  ly open in WAL m
e8f0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
e900: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
e910: 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
e920: 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ase being checkp
e930: 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a  ointed, this .**
e940: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
e950: 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  s SQLITE_LOCKED 
e960: 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  and a checkpoint
e970: 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
e980: 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  d. If .** an err
e990: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
e9a0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63  running the chec
e9b0: 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74  kpoint, an SQLit
e9c0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
e9d0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e  .** returned (i.
e9e0: 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  e. SQLITE_IOERR)
e9f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
ea00: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
ea10: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
ea20: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68  ase handle db sh
ea30: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20  ould be held by 
ea40: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20  the caller. The 
ea50: 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61  mutex.** associa
ea60: 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65  ted with the spe
ea70: 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69  cific b-tree bei
ea80: 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  ng checkpointed 
ea90: 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74  is taken by.** t
eaa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  his function whi
eab0: 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  le the checkpoin
eac0: 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a  t is running..**
ead0: 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61  .** If iDb is pa
eae0: 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ssed SQLITE_MAX_
eaf0: 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61  ATTACHED, then a
eb00: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
eb10: 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65  bases are.** che
eb20: 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e  ckpointed. If an
eb30: 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
eb40: 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75  tered it is retu
eb50: 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rned immediately
eb60: 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74   -.** no attempt
eb70: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63   is made to chec
eb80: 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69  kpoint any remai
eb90: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a  ning databases..
eba0: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
ebb0: 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20  eMode is one of 
ebc0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
ebd0: 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20  T_PASSIVE, FULL 
ebe0: 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69  or RESTART..*/.i
ebf0: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70  nt sqlite3Checkp
ec00: 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
ec10: 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65  , int iDb, int e
ec20: 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67  Mode, int *pnLog
ec30: 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a  , int *pnCkpt){.
ec40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ec50: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
ec60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ec70: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
eca0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
ecb0: 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f   attached dbs */
ecc0: 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30  .  int bBusy = 0
ecd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ece0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51     /* True if SQ
ecf0: 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65  LITE_BUSY has be
ed00: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  en encountered *
ed10: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
ed20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ed30: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
ed40: 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c  assert( !pnLog |
ed50: 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a  | *pnLog==-1 );.
ed60: 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70    assert( !pnCkp
ed70: 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31  t || *pnCkpt==-1
ed80: 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   );..  for(i=0; 
ed90: 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d  i<db->nDb && rc=
eda0: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
edb0: 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62  {.    if( i==iDb
edc0: 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f   || iDb==SQLITE_
edd0: 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a  MAX_ATTACHED ){.
ede0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
edf0: 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e  e3BtreeCheckpoin
ee00: 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  t(db->aDb[i].pBt
ee10: 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
ee20: 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70  pnCkpt);.      p
ee30: 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nLog = 0;.      
ee40: 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20  pnCkpt = 0;.    
ee50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ee60: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
ee70: 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20   bBusy = 1;.    
ee80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ee90: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
eea0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
eeb0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
eec0: 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54  & bBusy) ? SQLIT
eed0: 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23  E_BUSY : rc;.}.#
eee0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
eef0: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
ef00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ef10: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
ef20: 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f   main-memory sho
ef30: 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74  uld be used inst
ef40: 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ead of.** a temp
ef50: 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74  orary file for t
ef60: 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66  ransient pager f
ef70: 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65  iles and stateme
ef80: 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  nt journals..** 
ef90: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
efa0: 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
efb0: 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74  e value of db->t
efc0: 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69  emp_store (runti
efd0: 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29  me.** parameter)
efe0: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
eff0: 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53   time value of S
f000: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
f010: 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  . The.** followi
f020: 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
f030: 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  es the relations
f040: 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73  hip between thes
f050: 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
f060: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
f070: 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ns return value.
f080: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
f090: 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64  TEMP_STORE     d
f0a0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20  b->temp_store   
f0b0: 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65    Location of te
f0c0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
f0d0: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
f0e0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
f0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
f100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
f120: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
f130: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
f140: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
f150: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
f160: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
f170: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
f190: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
f1a0: 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
f1e0: 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20  urn 1).**   1   
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
f210: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
f220: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
f250: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
f260: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
f270: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
f280: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
f290: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
f2a0: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
f2b0: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
f2c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
f2e0: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
f2f0: 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20  1).**   3       
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
f310: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
f320: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
f330: 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1).*/.int sql
f340: 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
f350: 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a  (const sqlite3 *
f360: 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  db){.#if SQLITE_
f370: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20  TEMP_STORE==1.  
f380: 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
f390: 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65  p_store==2 );.#e
f3a0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
f3b0: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20  TEMP_STORE==2.  
f3c0: 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
f3d0: 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65  p_store!=1 );.#e
f3e0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
f3f0: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20  TEMP_STORE==3.  
f400: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
f410: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
f420: 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49  _STORE<1 || SQLI
f430: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a  TE_TEMP_STORE>3.
f440: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
f450: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
f460: 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  rn UTF-8 encoded
f470: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
f480: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
f490: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
f4a0: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
f4b0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
f4c0: 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33  3_errmsg(sqlite3
f4d0: 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63   *db){.  const c
f4e0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  har *z;.  if( !d
f4f0: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
f500: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
f510: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d  LITE_NOMEM);.  }
f520: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f530: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
f540: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
f550: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
f560: 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  tr(SQLITE_MISUSE
f570: 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71  _BKPT);.  }.  sq
f580: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f590: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f5a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
f5b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
f5c0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
f5d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d  LITE_NOMEM);.  }
f5e0: 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61  else{.    testca
f5f0: 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  se( db->pErr==0 
f600: 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  );.    z = (char
f610: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
f620: 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a  text(db->pErr);.
f630: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
f640: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
f650: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
f660: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
f670: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
f680: 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Code);.    }.  }
f690: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f6a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f6b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
f6c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f6d0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
f6e0: 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20  * Return UTF-16 
f6f0: 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
f700: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
f710: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
f720: 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
f730: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
f740: 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  *sqlite3_errmsg1
f750: 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  6(sqlite3 *db){.
f760: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f770: 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20  16 outOfMem[] = 
f780: 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20  {.    'o', 'u', 
f790: 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27  't', ' ', 'o', '
f7a0: 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65  f', ' ', 'm', 'e
f7b0: 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27  ', 'm', 'o', 'r'
f7c0: 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20  , 'y', 0.  };.  
f7d0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
f7e0: 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20   misuse[] = {.  
f7f0: 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c    'l', 'i', 'b',
f800: 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20   'r', 'a', 'r', 
f810: 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'y', ' ', .    '
f820: 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74  r', 'o', 'u', 't
f830: 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27  ', 'i', 'n', 'e'
f840: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c  , ' ', .    'c',
f850: 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20   'a', 'l', 'l', 
f860: 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a  'e', 'd', ' ', .
f870: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
f880: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
f890: 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'f', ' ', .   
f8a0: 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20   's', 'e', 'q', 
f8b0: 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27  'u', 'e', 'n', '
f8c0: 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a  c', 'e', 0.  };.
f8d0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
f8e0: 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
f8f0: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
f900: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a  *)outOfMem;.  }.
f910: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
f920: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
f930: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
f940: 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75  urn (void *)misu
f950: 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  se;.  }.  sqlite
f960: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f970: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
f980: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f990: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69   ){.    z = (voi
f9a0: 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
f9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
f9c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f9d0: 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
f9e0: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
f9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
fa00: 72 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64  r(db, db->errCod
fa10: 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  e, sqlite3ErrStr
fa20: 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a  (db->errCode));.
fa30: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
fa40: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
fa50: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a  b->pErr);.    }.
fa60: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28      /* A malloc(
fa70: 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65  ) may have faile
fa80: 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
fa90: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  l to sqlite3_val
faa0: 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20  ue_text16().    
fab0: 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69  ** above. If thi
fac0: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
fad0: 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  hen the db->mall
fae0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65  ocFailed flag ne
faf0: 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
fb00: 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
fb10: 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
fb20: 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
fb30: 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20  tead of via.    
fb40: 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  ** sqlite3ApiExi
fb50: 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65  t(), to avoid se
fb60: 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  tting the databa
fb70: 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  se handle error 
fb80: 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  message..    */.
fb90: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
fba0: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  iled = 0;.  }.  
fbb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fbc0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
fbd0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
fbe0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
fbf0: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
fc00: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
fc10: 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72  ost recent error
fc20: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
fc30: 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75  by an SQLite rou
fc40: 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73  tine. If NULL is
fc50: 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68  .** passed to th
fc60: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20  is function, we 
fc70: 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28  assume a malloc(
fc80: 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20  ) failed during 
fc90: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a  sqlite3_open()..
fca0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
fcb0: 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
fcc0: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
fcd0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
fce0: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
fcf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fd00: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
fd10: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
fd20: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
fd30: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
fd40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
fd50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
fd60: 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e  ->errCode & db->
fd70: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73  errMask;.}.int s
fd80: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
fd90: 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
fda0: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
fdb0: 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
fdc0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
fdd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
fde0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
fdf0: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
fe00: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
fe10: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
fe20: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
fe30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
fe40: 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f  b->errCode;.}../
fe50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
fe60: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
fe70: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
fe80: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
fe90: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
fea0: 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68  nt.  For now, th
feb0: 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20  is simply calls 
fec0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c  the internal sql
fed0: 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20  ite3ErrStr().** 
fee0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  function..*/.con
fef0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
ff00: 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b  _errstr(int rc){
ff10: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
ff20: 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a  3ErrStr(rc);.}..
ff30: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
ff40: 20 61 6c 6c 20 63 61 63 68 65 64 20 4b 65 79 49   all cached KeyI
ff50: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  nfo objects for 
ff60: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ff70: 69 6f 6e 20 22 64 62 22 0a 2a 2f 0a 73 74 61 74  ion "db".*/.stat
ff80: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
ff90: 74 65 43 61 63 68 65 64 4b 65 79 49 6e 66 6f 28  teCachedKeyInfo(
ffa0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
ffb0: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ffd0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
ffe0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
10010 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
10020 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
10050 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
10060 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
10070 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
10080 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
10090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
100a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
100c0 2a 20 45 61 63 68 20 69 6e 64 65 78 20 2a 2f 0a  * Each index */.
100d0 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
100e0 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
100f0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
10100 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  Db++){.    if( p
10110 44 62 2d 3e 70 42 74 3d 3d 30 20 29 20 63 6f 6e  Db->pBt==0 ) con
10120 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  tinue;.    sqlit
10130 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 44 62  e3BtreeEnter(pDb
10140 2d 3e 70 42 74 29 3b 0a 20 20 20 20 66 6f 72 28  ->pBt);.    for(
10150 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
10160 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
10170 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
10180 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
10190 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
101a0 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
101b0 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
101c0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
101d0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
101e0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
101f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10200 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 26 26  Idx->pKeyInfo &&
10210 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d   pIdx->pKeyInfo-
10220 3e 64 62 3d 3d 64 62 20 29 7b 0a 20 20 20 20 20  >db==db ){.     
10230 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
10240 6e 66 6f 55 6e 72 65 66 28 70 49 64 78 2d 3e 70  nfoUnref(pIdx->p
10250 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
10260 20 20 20 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e      pIdx->pKeyIn
10270 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  fo = 0;.        
10280 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10290 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
102a0 4c 65 61 76 65 28 70 44 62 2d 3e 70 42 74 29 3b  Leave(pDb->pBt);
102b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
102c0 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61  eate a new colla
102d0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
102e0 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e  r database "db".
102f0 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e    The name is zN
10300 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  ame.** and the e
10310 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a  ncoding is enc..
10320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
10330 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eateCollation(. 
10340 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20   sqlite3* db,.  
10350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
10360 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  e, .  u8 enc,.  
10370 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
10380 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
10390 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
103a0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
103b0 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
103c0 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43  l)(void*).){.  C
103d0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
103e0 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74   int enc2;.  int
103f0 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
10400 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
10410 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
10420 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10430 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
10440 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
10450 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
10460 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
10470 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
10480 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
10490 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
104a0 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
104b0 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
104c0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
104d0 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
104e0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
104f0 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
10500 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32  lly..  */.  enc2
10510 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61   = enc;.  testca
10520 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
10530 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74  _UTF16 );.  test
10540 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
10550 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
10560 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d   );.  if( enc2==
10570 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20  SQLITE_UTF16 || 
10580 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
10590 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20  16_ALIGNED ){.  
105a0 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f    enc2 = SQLITE_
105b0 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
105c0 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49  .  if( enc2<SQLI
105d0 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e  TE_UTF8 || enc2>
105e0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
105f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10600 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10610 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
10620 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   if this call is
10630 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70   removing or rep
10640 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69  lacing an existi
10650 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20  ng collation .  
10660 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20  ** sequence. If 
10670 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  so, and there ar
10680 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65  e active VMs, re
10690 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68  turn busy. If th
106a0 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20  ere.  ** are no 
106b0 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61  active VMs, inva
106c0 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63  lidate any pre-c
106d0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
106e0 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c  ts..  */.  pColl
106f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
10700 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
10710 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  c2, zName, 0);. 
10720 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
10730 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
10740 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
10750 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
10760 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
10770 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
10780 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
10790 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
107a0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
107b0 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
107c0 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
107d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
107e0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
107f0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
10800 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
10810 28 64 62 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69  (db);.    invali
10820 64 61 74 65 43 61 63 68 65 64 4b 65 79 49 6e 66  dateCachedKeyInf
10830 6f 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  o(db);..    /* I
10840 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
10850 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
10860 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
10870 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
10880 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
10890 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
108a0 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
108b0 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
108c0 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
108d0 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
108e0 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
108f0 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
10900 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
10910 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
10920 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
10930 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
10940 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
10950 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
10960 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
10970 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
10980 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
10990 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
109a0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
109b0 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
109c0 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
109d0 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20  CollSeq, zName, 
109e0 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  nName);.      in
109f0 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
10a00 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
10a10 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
10a20 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
10a30 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
10a40 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
10a50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
10a60 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
10a70 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
10a80 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
10a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10aa0 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
10ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10ac0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
10ad0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
10ae0 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
10af0 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
10b00 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
10b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10b20 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
10b30 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
10b40 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
10b50 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
10b60 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
10b70 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
10b80 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
10b90 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
10ba0 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
10bb0 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
10bc0 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  OK, 0);.  return
10bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
10be0 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
10bf0 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
10c00 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
10c10 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
10c20 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
10c30 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
10c40 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
10c50 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
10c60 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
10c70 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
10c80 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
10c90 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
10ca0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
10cb0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
10cc0 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
10cd0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
10ce0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
10cf0 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
10d00 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
10d10 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
10d20 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
10d30 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
10d40 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
10d50 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
10d60 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
10d70 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
10d80 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
10d90 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20  IABLE_NUMBER,.  
10da0 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
10db0 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a  ER_DEPTH,.};../*
10dc0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
10dd0 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
10de0 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
10df0 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
10e00 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
10e10 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
10e20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
10e30 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
10e40 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
10e50 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
10e60 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
10e70 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
10e80 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
10e90 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
10ea0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
10eb0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
10ec0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
10ed0 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
10ee0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
10ef0 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
10f00 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
10f10 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
10f20 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10f30 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
10f40 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
10f50 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
10f60 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
10f70 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
10f80 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
10f90 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
10fa0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
10fb0 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
10fc0 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
10fd0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
10fe0 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
10ff0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
11000 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20  TION_ARG>1000.# 
11010 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
11020 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75  _FUNCTION_ARG mu
11030 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
11040 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a  and 1000.#endif.
11050 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
11060 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c  TTACHED<0 || SQL
11070 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
11080 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  >62.# error SQLI
11090 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
110a0 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
110b0 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66 0a  0 and 62.#endif.
110c0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
110d0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
110e0 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
110f0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
11100 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
11110 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
11120 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
11130 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
11140 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
11150 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
11160 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
11170 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
11180 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
11190 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
111a0 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
111b0 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
111c0 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
111d0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
111e0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
111f0 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
11200 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
11210 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
11220 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
11230 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
11240 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
11250 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
11260 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
11270 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
11280 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
11290 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
112a0 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
112b0 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
112c0 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
112d0 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
112e0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
112f0 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
11300 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
11310 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
11320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
11330 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
11340 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
11350 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
11360 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a  int oldLimit;...
11370 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11380 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
11390 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
113a0 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
113b0 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
113c0 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
113d0 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
113e0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
113f0 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
11400 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
11410 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
11420 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
11430 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
11440 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
11450 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
11460 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
11470 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11480 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
11490 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
114a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
114b0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
114c0 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
114d0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
114e0 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
114f0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11500 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
11510 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
11520 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
11530 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11540 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
11550 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
11560 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
11570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11580 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11590 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
115a0 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
115b0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
115c0 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
115d0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
115e0 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
115f0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
11600 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
11610 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11620 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
11630 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
11640 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
11650 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
11660 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
11670 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
11680 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
11690 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
116a0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
116b0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
116c0 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11700 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
11710 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
11720 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
11730 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
11740 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
11750 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
11760 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
11770 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
11780 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11790 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
117a0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
117b0 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
117c0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
117d0 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
117e0 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c  PTH==(SQLITE_N_L
117f0 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69  IMIT-1) );...  i
11800 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
11810 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
11820 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
11830 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
11840 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
11850 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
11860 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
11870 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
11880 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
11890 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a  -52476-28732 */.
118a0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
118b0 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
118c0 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
118d0 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
118e0 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f  mit[limitId];  /
118f0 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32  * IMP: R-51463-2
11900 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  5634 */.    }.  
11910 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
11920 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
11930 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
11940 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  ldLimit;        
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11960 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34  IMP: R-53341-354
11970 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  19 */.}../*.** T
11980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11990 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f  used to parse bo
119a0 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d  th URIs and non-
119b0 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61  URI filenames pa
119c0 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75  ssed by the.** u
119d0 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74  ser to API funct
119e0 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65  ions sqlite3_ope
119f0 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  n() or sqlite3_o
11a00 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f  pen_v2(), and fo
11a10 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52  r database.** UR
11a20 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  Is specified as 
11a30 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73  part of ATTACH s
11a40 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
11a50 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
11a60 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
11a70 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
11a80 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
11a90 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c  se (or.** a NULL
11aa0 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20   to signify the 
11ab0 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20  default VFS) if 
11ac0 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74  the URI does not
11ad0 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d   contain a "vfs=
11ae0 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61  xxx".** query pa
11af0 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63  rameter. The sec
11b00 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  ond argument con
11b10 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f  tains the URI (o
11b20 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  r non-URI filena
11b30 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57  me).** itself. W
11b40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11b50 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  n is called the 
11b60 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65  *pFlags variable
11b70 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
11b80 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ** the default f
11b90 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65  lags to open the
11ba0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11bb0 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65   with. The value
11bc0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70   stored in.** *p
11bd0 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64  Flags may be upd
11be0 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
11bf0 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49  rning if the URI
11c00 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69   filename contai
11c10 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78  ns .** "cache=xx
11c20 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22  x" or "mode=xxx"
11c30 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
11c40 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  s..**.** If succ
11c50 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
11c60 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
11c70 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56  n this case *ppV
11c80 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  fs is set to poi
11c90 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53  nt to.** the VFS
11ca0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
11cb0 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
11cc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11cd0 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74  *pzFile is set t
11ce0 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
11cf0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
11d00 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
11d10 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20  e file to open. 
11d20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
11d30 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
11d40 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
11d50 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71  entually call sq
11d60 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
11d70 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
11d80 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  buffer..**.** If
11d90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11da0 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65  , then an SQLite
11db0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
11dc0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45  eturned and *pzE
11dd0 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20  rrMsg.** may be 
11de0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
11df0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
11e00 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  ing an English l
11e10 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a  anguage error .*
11e20 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
11e30 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
11e40 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
11e50 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
11e60 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
11e70 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e  buffer by callin
11e80 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
11e90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11ea0 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73  ParseUri(.  cons
11eb0 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
11ec0 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Vfs,        /* V
11ed0 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20  FS to use if no 
11ee0 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20  "vfs=xxx" query 
11ef0 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  option */.  cons
11f00 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20  t char *zUri,   
11f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11f20 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52  ul-terminated UR
11f30 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20  I to parse */.  
11f40 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46  unsigned int *pF
11f50 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
11f60 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54  /* IN/OUT: SQLIT
11f70 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
11f80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
11f90 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20  s **ppVfs,      
11fa0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46        /* OUT: VF
11fb0 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63  S to use */ .  c
11fc0 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20  har **pzFile,   
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fe0 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20  * OUT: Filename 
11ff0 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49  component of URI
12000 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
12010 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
12020 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
12030 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20  ror message (if 
12040 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a  rc!=SQLITE_OK) *
12050 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
12070 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20  igned int flags 
12080 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e  = *pFlags;.  con
12090 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
120a0 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63  zDefaultVfs;.  c
120b0 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
120c0 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69  ar c;.  int nUri
120d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
120e0 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73  30(zUri);..  ass
120f0 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d  ert( *pzErrMsg==
12100 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c  0 );..  if( ((fl
12110 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12120 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74 65  N_URI) || sqlite
12130 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f  3GlobalConfig.bO
12140 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20 6e  penUri) .   && n
12150 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
12160 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
12170 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  5)==0 .  ){.    
12180 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
12190 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121b0 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68   Parser state wh
121c0 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a  en parsing URI *
121d0 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20  /.    int iIn;  
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
12200 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
12210 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
12220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12230 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72    /* Output char
12240 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
12250 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
12260 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20  Uri+2;          
12270 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
12280 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
12290 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  /..    /* Make s
122a0 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f  ure the SQLITE_O
122b0 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20  PEN_URI flag is 
122c0 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20  set to indicate 
122d0 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e  to the VFS xOpen
122e0 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20   .    ** method 
122f0 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62  that there may b
12300 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65  e extra paramete
12310 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  rs following the
12320 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a   file-name.  */.
12330 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
12340 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20  ITE_OPEN_URI;.. 
12350 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49     for(iIn=0; iI
12360 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e  n<nUri; iIn++) n
12370 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49  Byte += (zUri[iI
12380 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46  n]=='&');.    zF
12390 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
123a0 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
123b0 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
123c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
123d0 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b  M;..    iIn = 5;
123e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
123f0 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52  ALLOW_URI_AUTHOR
12400 49 54 59 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ITY.    /* Disca
12410 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e  rd the scheme an
12420 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d  d authority segm
12430 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e  ents of the URI.
12440 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69   */.    if( zUri
12450 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69  [5]=='/' && zUri
12460 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [6]=='/' ){.    
12470 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20    iIn = 7;.     
12480 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
12490 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
124a0 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '/' ) iIn++;.   
124b0 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26 26     if( iIn!=7 &&
124c0 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d   (iIn!=16 || mem
124d0 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c  cmp("localhost",
124e0 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20 29   &zUri[7], 9)) )
124f0 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
12500 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
12510 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 75  rintf("invalid u
12520 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25 2e  ri authority: %.
12530 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  *s", .          
12540 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37    iIn-7, &zUri[7
12550 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
12560 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12570 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
12580 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
12590 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
125a0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
125b0 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e   filename and an
125c0 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  y query paramete
125d0 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c  rs into the zFil
125e0 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a  e buffer. .    *
125f0 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73 63  * Decode %HH esc
12600 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20  ape codes along 
12610 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a  the way. .    **
12620 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74  .    ** Within t
12630 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62  his loop, variab
12640 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62 65  le eState may be
12650 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20   set to 0, 1 or 
12660 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20  2, depending.   
12670 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69   ** on the parsi
12680 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66  ng context. As f
12690 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20  ollows:.    **. 
126a0 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69     **   0: Parsi
126b0 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20  ng file-name..  
126c0 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e    **   1: Parsin
126d0 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f  g name section o
126e0 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
126f0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
12700 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73      **   2: Pars
12710 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f  ing value sectio
12720 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
12730 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
12740 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53  r..    */.    eS
12750 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68  tate = 0;.    wh
12760 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
12770 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
12780 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b  ' ){.      iIn++
12790 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
127a0 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  %' .       && sq
127b0 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
127c0 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20  ri[iIn]) .      
127d0 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
127e0 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29  git(zUri[iIn+1])
127f0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
12800 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28     int octet = (
12810 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
12820 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20  zUri[iIn++]) << 
12830 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65  4);.        octe
12840 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54  t += sqlite3HexT
12850 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
12860 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
12870 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20  rt( octet>=0 && 
12880 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20  octet<256 );.   
12890 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d       if( octet==
128a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
128b0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
128c0 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30   taken when "%00
128d0 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e  " appears within
128e0 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69   the URI. In thi
128f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
12900 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c  ase we ignore al
12910 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65  l text in the re
12920 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70  mainder of the p
12930 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20  ath, name or.   
12940 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
12950 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
12960 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72  parsed. So ignor
12970 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
12980 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20  aracter.        
12990 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f    ** and skip to
129a0 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22   the next "?", "
129b0 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70  =" or "&", as ap
129c0 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20  propriate. */.  
129d0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
129e0 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
129f0 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20  0 && c!='#' .   
12a00 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
12a10 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27  State!=0 || c!='
12a20 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ?').            
12a30 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20    && (eState!=1 
12a40 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21  || (c!='=' && c!
12a50 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20  ='&')).         
12a60 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
12a70 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20  =2 || c!='&').  
12a80 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12a90 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20         iIn++;.  
12aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ab0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12ad0 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20  c = octet;.     
12ae0 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
12af0 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20  e==1 && (c=='&' 
12b00 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20  || c=='=') ){.  
12b10 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
12b20 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  iOut-1]==0 ){.  
12b30 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d          /* An em
12b40 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e  pty option name.
12b50 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74   Ignore this opt
12b60 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  ion altogether. 
12b70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
12b80 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
12b90 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20   zUri[iIn]!='#' 
12ba0 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d  && zUri[iIn-1]!=
12bb0 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '&' ) iIn++;.   
12bc0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
12bd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12be0 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b     if( c=='&' ){
12bf0 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65  .          zFile
12c00 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12c10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12c20 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
12c30 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 2;.        }.
12c40 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
12c50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
12c60 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d  eState==0 && c==
12c70 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d  '?') || (eState=
12c80 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b  =2 && c=='&') ){
12c90 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
12ca0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
12cb0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
12cc0 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
12cd0 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = c;.    }.    i
12ce0 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a  f( eState==1 ) z
12cf0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
12d00 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
12d10 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
12d20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
12d30 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a   = '\0';..    /*
12d40 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   Check if there 
12d50 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73  were any options
12d60 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20   specified that 
12d70 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70  should be interp
12d80 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65  reted .    ** he
12d90 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74  re. Options that
12da0 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64   are interpreted
12db0 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76   here include "v
12dc0 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68  fs" and those th
12dd0 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  at.    ** corres
12de0 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68  pond to flags th
12df0 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  at may be passed
12e00 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
12e10 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a  open_v2().    **
12e20 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20   method. */.    
12e30 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71  zOpt = &zFile[sq
12e40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
12e50 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ile)+1];.    whi
12e60 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20  le( zOpt[0] ){. 
12e70 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20       int nOpt = 
12e80 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12e90 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61  zOpt);.      cha
12ea0 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b  r *zVal = &zOpt[
12eb0 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69  nOpt+1];.      i
12ec0 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
12ed0 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b  3Strlen30(zVal);
12ee0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74  ..      if( nOpt
12ef0 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76  ==3 && memcmp("v
12f00 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30  fs", zOpt, 3)==0
12f10 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73   ){.        zVfs
12f20 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = zVal;.      }
12f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
12f40 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a  ruct OpenMode {.
12f50 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
12f60 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20  char *z;.       
12f70 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
12f80 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20       } *aMode = 
12f90 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
12fa0 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a  *zModeType = 0;.
12fb0 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b          int mask
12fc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
12fd0 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  t limit = 0;..  
12fe0 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
12ff0 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63  5 && memcmp("cac
13000 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30  he", zOpt, 5)==0
13010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
13020 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
13030 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b  Mode aCacheMode[
13040 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
13050 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53    { "shared",  S
13060 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13070 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
13080 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65        { "private
13090 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
130a0 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
130b0 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
130c0 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
130d0 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
130e0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   = SQLITE_OPEN_S
130f0 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54  HAREDCACHE|SQLIT
13100 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
13110 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61  CHE;.          a
13120 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64  Mode = aCacheMod
13130 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
13140 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  it = mask;.     
13150 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
13160 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20   "cache";.      
13170 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
13180 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d  nOpt==4 && memcm
13190 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20  p("mode", zOpt, 
131a0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
131b0 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
131c0 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d   OpenMode aOpenM
131d0 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
131e0 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53        { "ro",  S
131f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
13200 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  NLY },.         
13210 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49     { "rw",  SQLI
13220 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13230 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  E }, .          
13240 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54    { "rwc", SQLIT
13250 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
13260 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
13270 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20  REATE },.       
13280 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c       { "memory",
13290 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
132a0 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ORY },.         
132b0 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
132c0 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
132d0 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
132e0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
132f0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
13300 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
13310 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
13320 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
13330 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  | SQLITE_OPEN_ME
13340 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MORY;.          
13350 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64  aMode = aOpenMod
13360 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
13370 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67  it = mask & flag
13380 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  s;.          zMo
13390 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73  deType = "access
133a0 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
133b0 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20        if( aMode 
133c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
133d0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
133e0 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  t mode = 0;.    
133f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
13400 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b  Mode[i].z; i++){
13410 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
13420 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f  st char *z = aMo
13430 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20  de[i].z;.       
13440 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73       if( nVal==s
13450 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13460 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  ) && 0==memcmp(z
13470 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b  Val, z, nVal) ){
13480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
13490 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d  ode = aMode[i].m
134a0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
134b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
134c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
134d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
134e0 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ( mode==0 ){.   
134f0 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
13500 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
13510 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73  intf("no such %s
13520 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64   mode: %s", zMod
13530 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
13540 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
13550 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
13560 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
13570 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
13580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13590 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e     if( (mode & ~
135a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
135b0 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  RY)>limit ){.   
135c0 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
135d0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
135e0 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f  intf("%s mode no
135f0 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a  t allowed: %s",.
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13620 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
13630 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
13640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13650 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20  E_PERM;.        
13660 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
13670 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
13680 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c    }.          fl
13690 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e  ags = (flags & ~
136a0 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20  mask) | mode;.  
136b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
136c0 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  .      zOpt = &z
136d0 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20  Val[nVal+1];.   
136e0 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
136f0 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
13700 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b  _malloc(nUri+2);
13710 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
13720 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13730 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70  NOMEM;.    memcp
13740 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e  y(zFile, zUri, n
13750 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  Uri);.    zFile[
13760 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nUri] = '\0';.  
13770 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20    zFile[nUri+1] 
13780 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67  = '\0';.    flag
13790 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
137a0 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70  N_URI;.  }..  *p
137b0 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
137c0 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
137d0 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29   if( *ppVfs==0 )
137e0 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
137f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13800 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  f("no such vfs: 
13810 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  %s", zVfs);.    
13820 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
13830 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72  R;.  }. parse_ur
13840 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  i_out:.  if( rc!
13850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13860 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13870 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  File);.    zFile
13880 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c   = 0;.  }.  *pFl
13890 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a  ags = flags;.  *
138a0 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  pzFile = zFile;.
138b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
138c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
138d0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
138e0 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64  k of opening a d
138f0 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c  atabase on behal
13900 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  f of.** sqlite3_
13910 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74  open() and sqlit
13920 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65  e3_open16(). The
13930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
13940 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20  me "zFilename"  
13950 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63  .** is UTF-8 enc
13960 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oded..*/.static 
13970 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65  int openDatabase
13980 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
13990 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61  zFilename, /* Da
139a0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
139b0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f  UTF-8 encoded */
139c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
139d0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  b,        /* OUT
139e0 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62  : Returned datab
139f0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
13a00 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
13a10 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74  gs,    /* Operat
13a20 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20  ional flags */. 
13a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
13a40 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  s       /* Name 
13a50 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
13a60 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
13a70 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
13a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
13a90 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e  re allocated han
13aa0 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
13ab0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13ad0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
13ae0 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61    int isThreadsa
13af0 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fe;             
13b00 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68    /* True for th
13b10 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74  readsafe connect
13b20 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
13b30 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  zOpen = 0;      
13b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
13b50 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74  ename argument t
13b60 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f  o pass to BtreeO
13b70 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  pen() */.  char 
13b80 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20  *zErrMsg = 0;   
13b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
13ba0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
13bb0 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
13bc0 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d  () */..  *ppDb =
13bd0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
13be0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
13bf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13c00 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
13c10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13c20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  rc;.#endif..  /*
13c30 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73   Only allow sens
13c40 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
13c50 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  s of bits in the
13c60 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e   flags argument.
13c70 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e    .  ** Throw an
13c80 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f   error if any no
13c90 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74  n-sense combinat
13ca0 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66  ion is used.  If
13cb0 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20   we.  ** do not 
13cc0 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f  block illegal co
13cd0 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c  mbinations here,
13ce0 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65   it could trigge
13cf0 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20  r.  ** assert() 
13d00 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65  statements in de
13d10 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65  eper layers.  Se
13d20 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
13d30 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20  ons.  ** are:.  
13d40 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c  **.  **  1:  SQL
13d50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
13d60 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49  Y.  **  2:  SQLI
13d70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13d80 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49  E.  **  6:  SQLI
13d90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13da0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
13db0 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73  CREATE.  */.  as
13dc0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
13dd0 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30  N_READONLY  == 0
13de0 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x01 );.  assert(
13df0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13e00 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29  DWRITE == 0x02 )
13e10 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
13e20 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20  TE_OPEN_CREATE  
13e30 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74    == 0x04 );.  t
13e40 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
13e50 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b  ags&7))==0x02 );
13e60 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a   /* READONLY */.
13e70 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
13e80 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34  (flags&7))==0x04
13e90 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
13ea0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
13eb0 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
13ec0 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x40 ); /* READW
13ed0 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f  RITE | CREATE */
13ee0 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61  .  if( ((1<<(fla
13ef0 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d  gs&7)) & 0x46)==
13f00 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
13f10 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a  E_MISUSE_BKPT;..
13f20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
13f30 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
13f40 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
13f50 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
13f60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
13f70 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13f80 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
13f90 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
13fa0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
13fb0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13fc0 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
13fd0 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
13fe0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
13ff0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
14000 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14010 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
14020 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
14030 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
14040 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
14050 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
14060 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
14070 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
14080 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
14090 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
140a0 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
140b0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
140c0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
140d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
140e0 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
140f0 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
14100 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
14110 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
14120 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
14130 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
14140 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
14150 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
14160 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
14170 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
14180 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
14190 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
141a0 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
141b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
141c0 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
141d0 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
141e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
141f0 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f  DWRITE, SQLITE_O
14200 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49  PEN_CREATE, SQLI
14210 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
14220 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  CHE,.  ** SQLITE
14230 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
14240 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73  HE, and some res
14250 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c  erved bits.  Sil
14260 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
14270 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
14280 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
14290 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
142a0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
142b0 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
142c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
142d0 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
142e0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
142f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
14300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14310 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
14320 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
14330 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14340 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
14350 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14360 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
14370 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
14380 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14390 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
143a0 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
143b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
143c0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
143d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
143e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
143f0 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
14400 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14410 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
14420 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
14430 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
14440 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
14450 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
14460 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
14470 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
14480 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
14490 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
144a0 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
144b0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
144c0 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
144d0 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
144e0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
144f0 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
14500 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
14510 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
14520 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
14530 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
14540 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
14550 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
14560 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
14570 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
14580 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
14590 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
145a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
145b0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
145c0 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
145d0 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
145e0 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
145f0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
14600 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
14610 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
14620 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  c;..  assert( si
14630 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
14640 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69  ==sizeof(aHardLi
14650 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  mit) );.  memcpy
14660 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61  (db->aLimit, aHa
14670 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28  rdLimit, sizeof(
14680 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20  db->aLimit));.  
14690 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
146a0 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
146b0 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
146c0 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74  ->szMmap = sqlit
146d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
146e0 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78  zMmap;.  db->nex
146f0 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tPagesize = 0;. 
14700 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
14710 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
14720 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62  es | SQLITE_Enab
14730 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49  leTrigger | SQLI
14740 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69  TE_CacheSpill.#i
14750 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
14760 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
14770 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51  TIC_INDEX) || SQ
14780 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
14790 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
147b0 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
147c0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
147d0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
147e0 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20  FORMAT<4.       
147f0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
14800 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
14810 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
14820 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41  QLITE_ENABLE_LOA
14830 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
14850 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73  QLITE_LoadExtens
14860 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ion.#endif.#if S
14870 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45  QLITE_DEFAULT_RE
14880 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53  CURSIVE_TRIGGERS
14890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
148a0 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72    | SQLITE_RecTr
148b0 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69  iggers.#endif.#i
148c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
148d0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
148e0 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45  _KEYS) && SQLITE
148f0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
14900 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20  _KEYS.          
14910 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
14920 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64  ForeignKeys.#end
14930 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c  if.      ;.  sql
14940 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
14950 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
14960 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14970 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
14980 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
14990 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
149a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
149b0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
149c0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
149d0 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
149e0 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
149f0 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
14a00 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
14a10 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
14a20 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
14a30 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
14a40 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
14a50 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
14a60 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
14a70 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
14a80 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  e..  */.  create
14a90 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
14aa0 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
14ab0 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  TF8, 0, binCollF
14ac0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
14ad0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
14ae0 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
14af0 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
14b00 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
14b10 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
14b20 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
14b30 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20  ITE_UTF16LE, 0, 
14b40 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
14b50 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
14b60 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20  on(db, "RTRIM", 
14b70 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
14b80 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75  id*)1, binCollFu
14b90 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
14ba0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14bb0 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
14bc0 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
14bd0 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
14be0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
14bf0 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
14c00 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20   "BINARY", 0);. 
14c10 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
14c20 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
14c30 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54  /* Also add a UT
14c40 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  F-8 case-insensi
14c50 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  tive collation s
14c60 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72  equence. */.  cr
14c70 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
14c80 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49  , "NOCASE", SQLI
14c90 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61  TE_UTF8, 0, noca
14ca0 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c  seCollatingFunc,
14cb0 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65   0);..  /* Parse
14cc0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52   the filename/UR
14cd0 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20  I argument. */. 
14ce0 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d   db->openFlags =
14cf0 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73   flags;.  rc = s
14d00 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a  qlite3ParseUri(z
14d10 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
14d20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66  &flags, &db->pVf
14d30 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72  s, &zOpen, &zErr
14d40 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Msg);.  if( rc!=
14d50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14d70 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c  NOMEM ) db->mall
14d80 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
14d90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
14da0 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f  b, rc, zErrMsg ?
14db0 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d   "%s" : 0, zErrM
14dc0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
14dd0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
14de0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
14df0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  out;.  }..  /* O
14e00 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20  pen the backend 
14e10 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20  database driver 
14e20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
14e30 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
14e40 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20  Vfs, zOpen, db, 
14e50 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  &db->aDb[0].pBt,
14e60 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14e70 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67              flag
14e80 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s | SQLITE_OPEN_
14e90 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20  MAIN_DB);.  if( 
14ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14eb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14ec0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
14ed0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
14ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14ef0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
14f00 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
14f10 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
14f20 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44  ut;.  }.  db->aD
14f30 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[0].pSchema = s
14f40 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
14f50 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  db, db->aDb[0].p
14f60 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  Bt);.  db->aDb[1
14f70 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
14f80 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
14f90 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20   0);...  /* The 
14fa0 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c  default safety_l
14fb0 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69  evel for the mai
14fc0 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66  n database is 'f
14fd0 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65  ull'; for the te
14fe0 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
14ff0 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54   it is 'NONE'. T
15000 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
15010 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
15020 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
15030 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20  b->aDb[0].zName 
15040 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
15050 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
15060 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61  vel = 3;.  db->a
15070 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74  Db[1].zName = "t
15080 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  emp";.  db->aDb[
15090 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  1].safety_level 
150a0 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  = 1;..  db->magi
150b0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
150c0 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d  _OPEN;.  if( db-
150d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
150e0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
150f0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
15100 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69  Register all bui
15110 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c  lt-in functions,
15120 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65   but do not atte
15130 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a  mpt to read the.
15140 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
15150 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69  hema yet. This i
15160 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  s delayed until 
15170 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
15180 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
15190 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20   is accessed..  
151a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  */.  sqlite3Erro
151b0 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
151c0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65   0);.  sqlite3Re
151d0 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
151e0 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f  ctions(db);..  /
151f0 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63  * Load automatic
15200 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78   extensions - ex
15210 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61  tensions that ha
15220 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  ve been register
15230 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  ed.  ** using th
15240 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61  e sqlite3_automa
15250 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20  tic_extension() 
15260 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  API..  */.  rc =
15270 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
15280 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  (db);.  if( rc==
15290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
152a0 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
152b0 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
152c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
152d0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
152e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
152f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
15300 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
15310 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
15320 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
15330 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S1.  if( !db->ma
15340 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
15350 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
15360 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c  ite3Fts1Init(sql
15370 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
15380 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
15390 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
153a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
153b0 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66  ENABLE_FTS2.  if
153c0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
153d0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
153e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65  E_OK ){.    exte
153f0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
15400 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s2Init(sqlite3*)
15410 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15420 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a  e3Fts2Init(db);.
15430 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
15440 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15450 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d  _FTS3.  if( !db-
15460 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
15470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15480 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15490 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a  e3Fts3Init(db);.
154a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
154b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
154c0 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e  _ICU.  if( !db->
154d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
154e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
154f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15500 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20  3IcuInit(db);.  
15510 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
15520 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52   SQLITE_ENABLE_R
15530 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e  TREE.  if( !db->
15540 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
15550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
15560 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15570 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20  RtreeInit(db);. 
15580 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15590 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
155a0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
155b0 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
155c0 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
155d0 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
155e0 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
155f0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
15600 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
15610 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
15620 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
15630 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
15640 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
15650 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
15660 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
15670 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
15680 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
15690 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
156a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
156b0 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
156c0 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
156d0 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
156e0 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
156f0 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15720 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
15730 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62  endif..  /* Enab
15740 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
15750 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
15760 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
15770 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
15780 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15790 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
157c0 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
157d0 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
157e0 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
157f0 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
15800 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
15810 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
15820 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  endb_out:.  sqli
15830 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b  te3_free(zOpen);
15840 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
15850 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
15860 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
15870 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  dsafe==0 || sqli
15880 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15890 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
158a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
158b0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
158c0 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
158d0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
158e0 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
158f0 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
15900 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
15910 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
15920 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
15930 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
15940 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
15950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15960 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
15970 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
15980 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a  IC_SICK;.  }.  *
15990 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65  ppDb = db;.#ifde
159a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
159b0 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
159c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
159d0 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
159e0 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20  /* Opening a db 
159f0 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
15a00 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
15a10 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69  ed 0. */.    voi
15a20 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65  d *pArg = sqlite
15a30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
15a40 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71  qllogArg;.    sq
15a50 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15a60 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20  g.xSqllog(pArg, 
15a70 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  db, zFilename, 0
15a80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
15a90 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
15aa0 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
15ab0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
15ac0 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
15ad0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
15ae0 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  3_open(.  const 
15af0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
15b00 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
15b10 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Db .){.  return 
15b20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
15b30 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20  lename, ppDb,.  
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
15b60 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
15b70 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
15b80 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
15b90 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e  3_open_v2(.  con
15ba0 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
15bb0 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e,   /* Database
15bc0 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38   filename (UTF-8
15bd0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
15be0 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f  *ppDb,         /
15bf0 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62  * OUT: SQLite db
15c00 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
15c10 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
15c20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f       /* Flags */
15c30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15c40 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  Vfs        /* Na
15c50 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65  me of VFS module
15c60 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
15c70 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
15c80 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70  ase(filename, pp
15c90 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  Db, (unsigned in
15ca0 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  t)flags, zVfs);.
15cb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15cc0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
15cd0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
15ce0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
15cf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
15d00 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f  en16(.  const vo
15d10 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  id *zFilename, .
15d20 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
15d30 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
15d40 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20   *zFilename8;   
15d50 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63  /* zFilename enc
15d60 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e  oded in UTF-8 in
15d70 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20  stead of UTF-16 
15d80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
15d90 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
15da0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a  rc;..  assert( z
15db0 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73  Filename );.  as
15dc0 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20  sert( ppDb );.  
15dd0 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
15de0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15df0 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
15e00 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
15e10 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
15e20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
15e30 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  f.  pVal = sqlit
15e40 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
15e50 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
15e60 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
15e70 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
15e80 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
15e90 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
15ea0 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
15eb0 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
15ec0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
15ed0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
15ee0 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
15ef0 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
15f00 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
15f30 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
15f40 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
15f50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
15f60 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
15f70 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
15f80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15f90 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
15fa0 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
15fb0 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
15fc0 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70 44  {.      ENC(*ppD
15fd0 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  b) = SQLITE_UTF1
15fe0 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20  6NATIVE;.    }. 
15ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
16000 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16010 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75   }.  sqlite3Valu
16020 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
16030 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
16040 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
16050 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16060 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
16070 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
16080 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
16090 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
160a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
160b0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
160c0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
160d0 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
160e0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
160f0 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
16100 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
16110 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
16120 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
16130 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
16140 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
16150 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
16160 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16170 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
16180 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
16190 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
161a0 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
161b0 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
161c0 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
161d0 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20  mpare, 0);.  rc 
161e0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
161f0 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
16200 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16210 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
16220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16230 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
16240 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16250 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
16260 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
16270 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16280 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
16290 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
162a0 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
162b0 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
162c0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
162d0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
162e0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
162f0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
16300 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
16310 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
16320 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
16330 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16340 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
16350 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
16360 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
16370 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
16380 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
16390 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
163a0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
163b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
163c0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
163d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
163e0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
163f0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
16400 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
16410 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
16420 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
16430 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
16440 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
16450 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
16460 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
16470 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
16480 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
16490 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
164a0 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
164b0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
164c0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
164d0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
164e0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
164f0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
16500 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16510 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
16520 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame8;.  sqlite3_
16530 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
16540 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
16550 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
16560 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
16570 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
16580 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
16590 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
165a0 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
165b0 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
165c0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
165d0 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
165e0 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
165f0 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
16600 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
16610 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
16620 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
16630 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
16640 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16650 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
16660 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
16670 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16680 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
16690 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
166a0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
166b0 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
166c0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
166d0 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
166e0 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
166f0 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
16700 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16710 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
16720 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
16730 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
16740 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
16750 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
16760 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
16770 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
16780 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
16790 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
167a0 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
167b0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
167c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
167d0 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
167e0 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
167f0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
16800 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
16810 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
16820 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
16830 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
16840 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
16850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16860 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
16870 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
16880 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
16890 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
168a0 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
168b0 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
168c0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
168d0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
168e0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
168f0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
16900 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
16910 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
16920 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
16930 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
16940 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
16950 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
16960 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
16970 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
16980 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
16990 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
169a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
169b0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
169c0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
169d0 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
169e0 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
169f0 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
16a00 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
16a10 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
16a20 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
16a30 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
16a40 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
16a50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
16a60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
16a70 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
16a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16a90 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
16aa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16ab0 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
16ac0 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
16ad0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
16ae0 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
16af0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
16b00 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
16b10 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
16b20 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
16b30 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
16b40 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
16b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16b60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16b70 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
16b80 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
16b90 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16ba0 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
16bb0 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
16bc0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
16bd0 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
16be0 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
16bf0 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
16c00 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
16c10 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
16c20 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
16c30 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
16c40 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
16c50 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
16c60 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74  ROLLBACK..*/.int
16c70 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
16c80 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
16c90 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
16ca0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d  b->autoCommit;.}
16cb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
16cc0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
16cd0 72 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f  re subtitutes fo
16ce0 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
16cf0 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
16d00 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
16d10 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
16d20 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
16d30 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
16d40 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
16d50 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20  s.  They server 
16d60 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a  two purposes:.**
16d70 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20  .**   1.  Serve 
16d80 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  as a convenient 
16d90 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
16da0 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64  reakpoint in a d
16db0 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  ebugger.**      
16dc0 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
16dd0 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f  version error co
16de0 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e  nditions occurs.
16df0 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76  .**.**   2.  Inv
16e00 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  oke sqlite3_log(
16e10 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  ) to provide the
16e20 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63   source code loc
16e30 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20  ation where.**  
16e40 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c       a low-level
16e50 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20   error is first 
16e60 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74  detected..*/.int
16e70 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45   sqlite3CorruptE
16e80 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
16e90 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
16ea0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16eb0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
16ec0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
16ed0 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20  E_CORRUPT,.     
16ee0 20 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61           "databa
16ef0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74  se corruption at
16f00 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
16f10 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
16f20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
16f30 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
16f40 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
16f50 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69  ITE_CORRUPT;.}.i
16f60 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65  nt sqlite3Misuse
16f70 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
16f80 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
16f90 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16fa0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
16fb0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
16fc0 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20  TE_MISUSE, .    
16fd0 20 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73            "misus
16fe0 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
16ff0 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
17000 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
17010 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
17020 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
17030 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
17040 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
17050 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
17060 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
17070 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
17080 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
17090 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  );.  sqlite3_log
170a0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
170b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
170c0 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
170d0 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  le at line %d of
170e0 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
170f0 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
17100 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
17110 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
17120 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
17130 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N;.}...#ifndef S
17140 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
17150 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
17160 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
17170 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
17180 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
17190 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
171a0 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
171b0 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
171c0 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
171d0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
171e0 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
171f0 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
17200 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
17210 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
17220 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
17230 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
17240 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
17250 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
17260 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
17270 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
17280 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
17290 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
172a0 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
172b0 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
172c0 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
172d0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
172e0 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
172f0 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
17300 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ils..*/.#ifdef S
17310 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
17320 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74  UMN_METADATA.int
17330 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
17340 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
17350 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17370 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
17380 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
17390 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
173a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
173b0 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
173c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
173d0 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
173e0 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
173f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
17400 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
17410 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
17420 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
17430 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
17440 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
17450 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
17460 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
17470 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
17480 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
17490 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
174a0 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
174b0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
174c0 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
174d0 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
174e0 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
174f0 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
17500 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
17510 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
17520 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
17530 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
17540 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
17550 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
17560 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
17570 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
17580 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
17590 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
175a0 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
175b0 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
175c0 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
175d0 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72  nt iCol;..  char
175e0 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
175f0 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
17600 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
17610 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
17620 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
17630 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
17640 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
17650 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
17660 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
17670 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
17680 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
17690 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
176a0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
176b0 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
176c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
176d0 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
176e0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
176f0 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
17700 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
17710 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
17720 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
17730 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
17740 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17750 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
17760 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
17770 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
17780 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
17790 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
177a0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
177b0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
177c0 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
177d0 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
177e0 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ted */.  if( sql
177f0 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
17800 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
17810 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
17820 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ey;.    if( iCol
17830 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  >=0 ){.      pCo
17840 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
17850 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iCol];.    }.  }
17860 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
17870 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
17880 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
17890 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
178a0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
178b0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
178c0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
178d0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
178e0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
178f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
17910 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
17920 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30  {.      pTab = 0
17930 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72  ;.      goto err
17940 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
17950 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
17960 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
17970 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
17980 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
17990 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
179a0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
179b0 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
179c0 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
179d0 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
179e0 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
179f0 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
17a00 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
17a10 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
17a20 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
17a30 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
17a40 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
17a50 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
17a60 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
17a70 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
17a80 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
17a90 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
17aa0 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
17ab0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
17ac0 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
17ad0 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
17ae0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
17af0 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
17b00 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
17b10 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
17b20 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
17b30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
17b40 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
17b50 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
17b60 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f   zDataType = pCo
17b70 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43  l->zType;.    zC
17b80 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
17b90 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
17ba0 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
17bb0 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
17bc0 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63  ykey  = (pCol->c
17bd0 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
17be0 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20  G_PRIMKEY)!=0;. 
17bf0 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
17c00 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
17c10 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
17c20 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
17c30 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
17c40 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
17c50 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
17c60 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
17c70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
17c80 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
17c90 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
17ca0 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
17cb0 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
17cc0 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
17cd0 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
17ce0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
17cf0 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
17d00 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
17d10 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
17d20 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
17d30 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
17d40 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
17d50 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
17d60 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
17d70 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
17d80 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
17d90 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
17da0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
17db0 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
17dc0 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
17dd0 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
17de0 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
17df0 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
17e00 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
17e10 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
17e20 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
17e30 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
17e40 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
17e50 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
17e60 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
17e70 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
17e80 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
17e90 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
17ea0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
17eb0 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
17ec0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
17ed0 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
17ee0 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
17ef0 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
17f00 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
17f10 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
17f20 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
17f30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
17f40 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  ror(db, rc, (zEr
17f50 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
17f60 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
17f70 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
17f80 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
17f90 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
17fa0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
17fb0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
17fc0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
17fd0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
17fe0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
17ff0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
18000 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
18010 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
18020 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
18030 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
18040 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
18050 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
18060 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
18070 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
18080 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
18090 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
180a0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
180b0 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
180c0 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
180d0 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
180e0 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
180f0 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
18100 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
18110 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
18120 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
18130 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
18140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18150 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
18160 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
18170 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
18180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18190 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
181a0 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
181b0 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20  b, int onoff){. 
181c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
181d0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
181e0 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
181f0 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
18200 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
18210 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
18220 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
18230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
18250 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
18260 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
18270 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
18280 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
18290 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
182a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
182b0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
182c0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
182d0 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
182e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
182f0 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
18300 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
18310 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
18320 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73  x);.  pBtree = s
18330 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
18340 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
18350 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
18360 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
18370 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
18380 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73  _file *fd;.    s
18390 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
183a0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50  (pBtree);.    pP
183b0 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
183c0 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
183d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
183e0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66  ager!=0 );.    f
183f0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
18400 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
18410 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
18420 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
18430 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
18440 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
18450 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
18460 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
18470 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18480 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
18490 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
184a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
184b0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
184c0 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
184d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
184e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
184f0 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
18500 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18510 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
18520 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18530 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
18540 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
18550 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65    .}../*.** Inte
18560 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
18570 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
18580 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
18590 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
185a0 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
185b0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
185c0 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
185d0 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
185e0 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
185f0 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
18600 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
18610 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
18620 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
18630 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
18640 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18650 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
18660 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
18670 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
18680 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
18690 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
186a0 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
186b0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
186c0 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
186d0 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
186e0 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
186f0 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
18700 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
18710 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
18720 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
18730 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
18740 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
18750 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
18760 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
18770 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
18780 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
18790 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
187a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
187b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
187c0 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
187d0 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
187e0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
187f0 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
18800 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
18810 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
18820 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
18830 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
18840 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
18850 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
18860 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
18870 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
18880 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
18890 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
188a0 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
188b0 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74  sqlite3PrngReset
188c0 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
188d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
188e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
188f0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
18900 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
18910 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
18920 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
18930 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
18940 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
18950 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
18960 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
18970 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
18980 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
18990 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
189a0 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
189b0 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
189c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
189d0 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
189e0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
189f0 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
18a00 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
18a10 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
18a20 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
18a30 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
18a40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18a50 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
18a60 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
18a70 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
18a80 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
18a90 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
18aa0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
18ab0 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
18ac0 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
18ad0 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
18ae0 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
18af0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
18b00 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
18b10 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
18b20 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
18b30 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
18b40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
18b50 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
18b60 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
18b70 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
18b80 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
18b90 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
18ba0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
18bb0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
18bc0 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
18bd0 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
18be0 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
18bf0 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
18c00 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
18c10 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
18c20 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
18c30 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
18c40 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
18c50 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
18c60 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
18c70 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
18c80 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
18c90 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
18ca0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
18cb0 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
18cc0 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
18cd0 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
18ce0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
18cf0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
18d00 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
18d10 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
18d20 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
18d30 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
18d40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
18d50 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
18d60 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
18d70 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
18d80 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
18d90 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
18da0 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
18db0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
18dc0 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
18dd0 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
18de0 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
18df0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
18e00 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
18e10 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
18e20 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
18e30 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
18e40 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
18e50 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
18e60 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
18e70 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
18e80 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
18e90 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
18ea0 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
18eb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18ec0 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
18ed0 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
18ee0 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72 69  .    ** dileteri
18ef0 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
18f00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
18f10 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
18f20 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
18f30 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
18f40 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
18f50 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
18f60 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
18f70 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
18f80 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
18f90 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
18fa0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
18fb0 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
18fc0 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
18fd0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
18fe0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18ff0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
19000 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
19010 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
19020 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
19030 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
19040 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
19050 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
19060 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
19070 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
19080 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
19090 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
190a0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
190b0 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
190c0 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
190d0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
190e0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
190f0 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
19100 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
19110 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
19120 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
19130 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
19140 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
19150 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
19160 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
19170 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
19180 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
19190 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
191a0 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
191b0 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
191c0 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
191d0 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
191e0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
191f0 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
19200 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
19210 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
19220 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
19230 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
19240 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19250 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
19260 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
19270 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
19280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
19290 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
192a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
192b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
192c0 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
192d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
192e0 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
192f0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
19300 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
19310 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
19320 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
19330 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
19340 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
19350 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
19360 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
19370 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20  s ALWAYS(X).  . 
19380 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
19390 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73   recommended tes
193a0 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74  t is X==2.  If t
193b0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
193c0 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 2, that means
193d0 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29  .    ** ALWAYS()
193e0 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
193f0 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73   both no-op pass
19400 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c  -through macros,
19410 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20   which is the.  
19420 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74    ** default set
19430 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65  ting.  If the re
19440 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c  turn value is 1,
19450 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69   then ALWAYS() i
19460 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  s either.    ** 
19470 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
19480 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73  ue or else it as
19490 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67  serts if its arg
194a0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a  ument is false..
194b0 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
194c0 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d   behavior (hard-
194d0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69  coded to true) i
194e0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
194f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
19500 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
19510 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
19520 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  is disabled and 
19530 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
19540 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65  * behavior (asse
19550 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  rt if the argume
19560 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69  nt to ALWAYS() i
19570 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20  s false) is the 
19580 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
19590 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
195a0 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
195b0 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
195c0 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  bled..    **.   
195d0 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65   ** The run-time
195e0 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20   test procedure 
195f0 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74  might look somet
19600 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
19610 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
19620 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
19630 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
19640 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
19650 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a  , 2)==2 ){.    *
19660 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
19670 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
19680 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  re no-op pass-th
19690 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20  rough macros.   
196a0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   **    }else if(
196b0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
196c0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
196d0 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29  TCTRL_ASSERT, 1)
196e0 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   ){.    **      
196f0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73  // ALWAYS(x) ass
19700 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74  erts that x is t
19710 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73  rue. NEVER(x) as
19720 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65  serts x is false
19730 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  ..    **    }els
19740 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  e{.    **      /
19750 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61  / ALWAYS(x) is a
19760 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45   constant 1.  NE
19770 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73  VER(x) is a cons
19780 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20  tant 0..    **  
19790 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63    }.    */.    c
197a0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
197b0 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20  TRL_ALWAYS: {.  
197c0 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
197d0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
197e0 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29    rc = ALWAYS(x)
197f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19800 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
19810 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19820 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19830 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c  TRL_RESERVE, sql
19840 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
19850 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
19860 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  et the nReserve 
19870 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68  size to N for th
19880 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19890 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
198a0 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f      ** connectio
198b0 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  n db..    */.   
198c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
198d0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b  TCTRL_RESERVE: {
198e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
198f0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
19900 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
19910 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
19920 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  ap,int);.      s
19930 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
19940 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
19950 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19960 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d  eSetPageSize(db-
19970 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20  >aDb[0].pBt, 0, 
19980 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  x, 0);.      sql
19990 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
199a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
199b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
199c0 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
199d0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
199e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
199f0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c  TIMIZATIONS, sql
19a00 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
19a10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
19a20 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
19a30 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
19a40 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69  ations for testi
19a50 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
19a60 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  e .    ** argume
19a70 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73  nt N is a bitmas
19a80 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
19a90 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ns to be disable
19aa0 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20  d.  For normal. 
19ab0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20     ** operation 
19ac0 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20  N should be 0.  
19ad0 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
19ae0 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20   a test program 
19af0 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a  (like the.    **
19b00 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20   SQL Logic Test 
19b10 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75  or SLT test modu
19b20 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20  le) can run the 
19b30 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c  same SQL multipl
19b40 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77  e times.    ** w
19b50 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ith various opti
19b60 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c  mizations disabl
19b70 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
19b80 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  t the same answe
19b90 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61  r.    ** is obta
19ba0 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61  ined in every ca
19bb0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
19bc0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19bd0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
19be0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
19bf0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
19c00 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
19c10 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c       db->dbOptFl
19c20 61 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61  ags = (u16)(va_a
19c30 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78  rg(ap, int) & 0x
19c40 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65  ffff);.      bre
19c50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
19c60 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
19c70 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  RD.    /* sqlite
19c80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
19c90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
19ca0 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20  SKEYWORD, const 
19cb0 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20  char *zWord).   
19cc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57   **.    ** If zW
19cd0 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64  ord is a keyword
19ce0 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74   recognized by t
19cf0 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20  he parser, then 
19d00 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a  return the.    *
19d10 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77  * number of keyw
19d20 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f  ords.  Or if zWo
19d30 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77  rd is not a keyw
19d40 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ord, return 0.. 
19d50 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68     ** .    ** Th
19d60 69 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20  is test feature 
19d70 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
19d80 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d  e in the amalgam
19d90 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20  ation since.    
19da0 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f  ** the SQLITE_N_
19db0 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73  KEYWORD macro is
19dc0 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20   not defined in 
19dd0 74 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c  this file if SQL
19de0 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75  ite.    ** is bu
19df0 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61  ilt using separa
19e00 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e  te source files.
19e10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
19e20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19e30 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20  _ISKEYWORD: {.  
19e40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19e50 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61  zWord = va_arg(a
19e60 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
19e70 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
19e80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
19e90 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20  Word);.      rc 
19ea0 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  = (sqlite3Keywor
19eb0 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64  dCode((u8*)zWord
19ec0 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53  , n)!=TK_ID) ? S
19ed0 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
19ee0 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  : 0;.      break
19ef0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a  ;.    }.#endif .
19f00 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
19f10 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
19f20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
19f30 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20  ATCHMALLOC, sz, 
19f40 26 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20  &pNew, pFree);. 
19f50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73     **.    ** Pas
19f60 73 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c  s pFree into sql
19f70 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
19f80 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a  ). .    ** If sz
19f90 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  >0 then allocate
19fa0 20 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65   a scratch buffe
19fb0 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20  r into pNew.  . 
19fc0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19fd0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
19fe0 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a  CRATCHMALLOC: {.
19ff0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65        void *pFre
1a000 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20  e, **ppNew;.    
1a010 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
1a020 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
1a030 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65  int);.      ppNe
1a040 77 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  w = va_arg(ap, v
1a050 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46  oid**);.      pF
1a060 72 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ree = va_arg(ap,
1a070 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69   void*);.      i
1a080 66 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d  f( sz ) *ppNew =
1a090 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
1a0a0 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20  alloc(sz);.     
1a0b0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
1a0c0 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20  ree(pFree);.    
1a0d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1a0e0 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1a0f0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1a100 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
1a110 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69  CALTIME_FAULT, i
1a120 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a  nt onoff);.    *
1a130 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61  *.    ** If para
1a140 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e  meter onoff is n
1a150 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75  on-zero, configu
1a160 72 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20  re the wrappers 
1a170 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20  so that all.    
1a180 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ** subsequent ca
1a190 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65  lls to localtime
1a1a0 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20  () and variants 
1a1b0 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69  fail. If onoff i
1a1c0 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75  s zero,.    ** u
1a1d0 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67  ndo this setting
1a1e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a1f0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1a200 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
1a210 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1a220 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1a230 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d  LocaltimeFault =
1a240 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1a250 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a260 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65     }..#if define
1a270 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1a280 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20  TREE_EXPLAIN).  
1a290 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1a2a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1a2b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c  TE_TESTCTRL_EXPL
1a2c0 41 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a 2a  AIN_STMT,.    **
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1a2f0 73 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72  stmt*,const char
1a300 2a 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  **);.    **.    
1a310 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77  ** If compiled w
1a320 69 74 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ith SQLITE_ENABL
1a330 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c 20  E_TREE_EXPLAIN, 
1a340 65 61 63 68 20 73 71 6c 69 74 65 33 5f 73 74 6d  each sqlite3_stm
1a350 74 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20 61  t holds.    ** a
1a360 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
1a370 63 72 69 62 65 73 20 74 68 65 20 6f 70 74 69 6d  cribes the optim
1a380 69 7a 65 64 20 70 61 72 73 65 20 74 72 65 65 2e  ized parse tree.
1a390 20 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74    This test-cont
1a3a0 72 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  rol.    ** retur
1a3b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1a3c0 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20  that string..   
1a3d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1a3e0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50  ITE_TESTCTRL_EXP
1a3f0 4c 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20 20  LAIN_STMT: {.   
1a400 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
1a410 2a 70 53 74 6d 74 20 3d 20 76 61 5f 61 72 67 28  *pStmt = va_arg(
1a420 61 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ap, sqlite3_stmt
1a430 2a 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  *);.      const 
1a440 63 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20 76  char **pzRet = v
1a450 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
1a460 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20 2a  char**);.      *
1a470 70 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  pzRet = sqlite3V
1a480 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 28  dbeExplanation((
1a490 56 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20  Vdbe*)pStmt);.  
1a4a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a4b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1a4c0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1a4d0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1a4e0 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1a4f0 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20  RUPT, int);.    
1a500 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72  **.    ** Set or
1a510 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68   clear a flag th
1a520 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
1a530 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1a540 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65  ile is always we
1a550 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65  ll-.    ** forme
1a560 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72  d and never corr
1a570 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20  upt.  This flag 
1a580 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61  is clear by defa
1a590 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ult, indicating 
1a5a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61  that.    ** data
1a5b0 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
1a5c0 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20   have arbitrary 
1a5d0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74  corruption.  Set
1a5e0 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75  ting the flag du
1a5f0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74  ring.    ** test
1a600 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61  ing causes certa
1a610 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1a620 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1a630 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74  de to be activat
1a640 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  ed.    ** that d
1a650 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69  emonstrat invari
1a660 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72  ants on well-for
1a670 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1a680 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1a690 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1a6a0 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
1a6b0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1a6c0 65 33 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f  e3Config.neverCo
1a6d0 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61  rrupt = va_arg(a
1a6e0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1a6f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  reak;.    }..  }
1a700 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1a710 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a720 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
1a730 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
1a740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1a750 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
1a760 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
1a770 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1a780 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
1a790 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
1a7a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
1a7b0 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
1a7c0 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
1a7d0 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
1a7e0 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
1a7f0 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
1a800 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
1a810 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
1a820 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
1a830 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1a840 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
1a850 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
1a860 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
1a870 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
1a880 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1a890 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
1a8a0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
1a8b0 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
1a8c0 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
1a8d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1a8e0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
1a8f0 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
1a900 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
1a910 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
1a920 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
1a930 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
1a940 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1a950 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
1a960 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1a970 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
1a980 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
1a990 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1a9a0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1a9b0 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
1a9c0 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
1a9d0 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d  ;.  zFilename +=
1a9e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1a9f0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
1aa00 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e  .  while( zFilen
1aa10 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
1aa20 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69  t x = strcmp(zFi
1aa30 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1aa40 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
1aa50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1aa60 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1aa70 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29  ;.    if( x==0 )
1aa80 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1aa90 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  e;.    zFilename
1aaa0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1aab0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1aac0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1aad0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
1aae0 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  urn a boolean va
1aaf0 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
1ab00 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e  parameter..*/.in
1ab10 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  t sqlite3_uri_bo
1ab20 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72  olean(const char
1ab30 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
1ab40 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
1ab50 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63   int bDflt){.  c
1ab60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
1ab70 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1ab80 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
1ab90 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74  zParam);.  bDflt
1aba0 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72   = bDflt!=0;.  r
1abb0 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65  eturn z ? sqlite
1abc0 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62  3GetBoolean(z, b
1abd0 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d  Dflt) : bDflt;.}
1abe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1abf0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
1ac00 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
1ac10 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
1ac20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1ac30 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28  lite3_uri_int64(
1ac40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ac50 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
1ac60 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73  Filename as pass
1ac70 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20  ed to xOpen */. 
1ac80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1ac90 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52  ram,       /* UR
1aca0 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67  I parameter soug
1acb0 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ht */.  sqlite3_
1acc0 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20  int64 bDflt     
1acd0 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70    /* return if p
1ace0 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73  arameter is miss
1acf0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ing */.){.  cons
1ad00 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1ad10 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1ad20 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
1ad30 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ram);.  sqlite3_
1ad40 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a  int64 v;.  if( z
1ad50 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f 69 36   && sqlite3Atoi6
1ad60 34 28 7a 2c 20 26 76 2c 20 73 71 6c 69 74 65 33  4(z, &v, sqlite3
1ad70 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
1ad80 49 54 45 5f 55 54 46 38 29 3d 3d 53 51 4c 49 54  ITE_UTF8)==SQLIT
1ad90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
1ada0 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
1adb0 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
1adc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
1add0 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
1ade0 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
1adf0 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
1ae00 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1ae10 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
1ae20 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
1ae30 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1ae40 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1ae50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1ae60 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1ae70 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
1ae80 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20  ->aDb[i].pBt.   
1ae90 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30    && (zDbName==0
1aea0 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
1aeb0 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e  mp(zDbName, db->
1aec0 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aDb[i].zName)==0
1aed0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1aee0 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d  eturn db->aDb[i]
1aef0 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .pBt;.    }.  }.
1af00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1af10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1af20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
1af30 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
1af40 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1af50 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
1af60 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
1af70 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
1af80 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
1af90 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1afa0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1afb0 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44   *pBt = sqlite3D
1afc0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1afd0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
1afe0 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
1aff0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
1b000 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
1b010 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1b020 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
1b030 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
1b040 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
1b050 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
1b060 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
1b070 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
1b080 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
1b090 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1b0a0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1b0b0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  ){.  Btree *pBt 
1b0c0 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1b0d0 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1b0e0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
1b0f0 74 20 3f 20 73 71 6c 69 74 65 33 50 61 67 65 72  t ? sqlite3Pager
1b100 49 73 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  Isreadonly(sqlit
1b110 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
1b120 29 29 20 3a 20 2d 31 3b 0a 7d 0a                 )) : -1;.}.