/ Hex Artifact Content
Login

Artifact 1010acfb69ccd62e34e3b83664537450225c74e2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1110: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
1120: 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  nt bRunExtraInit
1130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1150: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
1160: 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ion needed */.#e
1170: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1180: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
11a0: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
11b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d0: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
11e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
11f0: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
1200: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
1210: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
1220: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
1230: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1240: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
1250: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
1260: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1270: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
1280: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
1290: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
12a0: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
12b0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
12c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
12f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1300: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1310: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1320: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
1330: 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ed.  If unable t
1340: 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  o .  ** initiali
1350: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
1360: 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65  system, return e
1370: 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72  arly with the er
1380: 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ror..  ** If the
1390: 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69   system is so si
13a0: 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75  ck that we are u
13b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13c0: 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20  e a mutex,.  ** 
13d0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  there is not muc
13e0: 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e  h SQLite is goin
13f0: 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  g to be able to 
1400: 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  do..  **.  ** Th
1410: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
1420: 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65  m must take care
1430: 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20   of serializing 
1440: 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69  its own.  ** ini
1450: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  tialization..  *
1460: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1470: 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69  MutexInit();.  i
1480: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1490: 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  c;..  /* Initial
14a0: 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29  ize the malloc()
14b0: 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20   system and the 
14c0: 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d  recursive pInitM
14d0: 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a  utex mutex..  **
14e0: 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
14f0: 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1500: 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45  the STATIC_MASTE
1510: 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74  R mutex.  Note t
1520: 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c  hat.  ** MutexAl
1530: 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20  loc() is called 
1540: 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74  for a static mut
1550: 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74  ex prior to init
1560: 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a  ializing the.  *
1570: 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  * malloc subsyst
1580: 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65  em - this implie
1590: 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  s that the alloc
15a0: 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69  ation of a stati
15b0: 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73  c.  ** mutex mus
15c0: 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75  t not require su
15d0: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d  pport from the m
15e0: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e  alloc subsystem.
15f0: 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  .  */.  MUTEX_LO
1600: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
1610: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1620: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1630: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
1640: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1650: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
1660: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1670: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
1680: 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71  t = 1;.  if( !sq
1690: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
16b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16c0: 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a  e3MallocInit();.
16d0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1700: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1710: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71  = 1;.    if( !sq
1720: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1730: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1750: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1760: 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20  utex =.         
1770: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c    sqlite3MutexAl
1780: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1790: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
17a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
17b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
17c0: 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65  Mutex && !sqlite
17d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
17e0: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
17f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1800: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1810: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1830: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1840: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1850: 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73  Mutex++;.  }.  s
1860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1870: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
1880: 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20  /* If rc is not 
1890: 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69  SQLITE_OK at thi
18a0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69  s point, then ei
18b0: 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a  ther the malloc.
18c0: 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63    ** subsystem c
18d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74  ould not be init
18e0: 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73  ialized or the s
18f0: 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20  ystem failed to 
1900: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68  allocate.  ** th
1910: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1920: 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  ex. Return an er
1930: 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61  ror in either ca
1940: 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  se.  */.  if( rc
1950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1960: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1970: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72  }..  /* Do the r
1980: 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69  est of the initi
1990: 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20  alization under 
19a0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75  the recursive mu
19b0: 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  tex so.  ** that
19c0: 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65   we will be able
19d0: 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72   to handle recur
19e0: 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a  sive calls into.
19f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1a00: 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20  tialize().  The 
1a10: 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1a20: 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68  normally come th
1a30: 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74  rough.  ** sqlit
1a40: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65  e3_os_init() whe
1a50: 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c  n it invokes sql
1a60: 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1a70: 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20  r(), but other. 
1a80: 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61   ** recursive ca
1a90: 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  lls might also b
1aa0: 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a  e possible..  **
1ab0: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
1ac0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30  TION-OF: R-00140
1ad0: 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75  -37445 SQLite au
1ae0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69  tomatically seri
1af0: 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a  alizes calls.  *
1b00: 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d  * to the xInit m
1b10: 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49  ethod, so the xI
1b20: 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20  nit method need 
1b30: 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66  not be threadsaf
1b40: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
1b50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78   following mutex
1b60: 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69   is what seriali
1b70: 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68  zes access to th
1b80: 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20  e appdef pcache 
1b90: 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f  xInit.  ** metho
1ba0: 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ds.  The sqlite3
1bb0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e  _pcache_methods.
1bc0: 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65  xInit() all is e
1bd0: 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20  mbedded in the. 
1be0: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
1bf0: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c00: 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  ize()..  */.  sq
1c10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c20: 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  r(sqlite3GlobalC
1c30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1c40: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1c50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1c60: 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  nit==0 && sqlite
1c70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1c80: 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20  Progress==0 ){. 
1c90: 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a     FuncDefHash *
1ca0: 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28  pHash = &GLOBAL(
1cb0: 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c  FuncDefHash, sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
1cd0: 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ons);.    sqlite
1ce0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1cf0: 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  Progress = 1;.  
1d00: 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20    memset(pHash, 
1d10: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
1d20: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1d30: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ));.    sqlite3R
1d40: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
1d50: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66  ctions();.    if
1d60: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1d70: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
1d80: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
1da0: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
1db0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1de0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1df0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
1e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e  rc = sqlite3OsIn
1e10: 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  it();.    }.    
1e20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e30: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e40: 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65  e3PCacheBufferSe
1e50: 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  tup( sqlite3Glob
1e60: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20  alConfig.pPage, 
1e70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
1e90: 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c  zPage, sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
1eb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1ed0: 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  nit = 1;.#ifdef 
1ee0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
1ef0: 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74 72  T.      bRunExtr
1f00: 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69  aInit = 1;.#endi
1f10: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
1f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f30: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
1f40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1f50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1f70: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
1f80: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
1f90: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
1fa0: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
1fb0: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
1fc0: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
1fd0: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
1fe0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ff0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
2000: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
2010: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2020: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
2030: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2040: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
2050: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
2060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
2070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
2080: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
2090: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20a0: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
20b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
20c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
20d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
20e0: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
20f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2100: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
2110: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
2120: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
2130: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
2140: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
2150: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
2160: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
2170: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
2180: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
2190: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
21a0: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
21b0: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
21c0: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
21d0: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
21e0: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
21f0: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
2200: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2210: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
2220: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
2230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2240: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
2250: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
2260: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
2270: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
2280: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2290: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
22a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22b0: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
22c0: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
22d0: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
22e0: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
22f0: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
2300: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
2310: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
2320: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
2330: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2340: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
2350: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
2360: 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69  .  /* Do extra i
2370: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74  nitialization st
2380: 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79  eps requested by
2390: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52   the SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70  A_INIT.  ** comp
23b0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
23c0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
23d0: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
23e0: 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e   if( bRunExtraIn
23f0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2400: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2410: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
2420: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58    rc = SQLITE_EX
2430: 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d  TRA_INIT(0);.  }
2440: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2450: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
2460: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
2470: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
2480: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
2490: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
24a0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
24b0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
24c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
24d0: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
24e0: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
24f0: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2500: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2510: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2520: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
2530: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
2540: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
2550: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
2560: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
2570: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
2580: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
2590: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
25a0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
25b0: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
25c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25d0: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
25e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
25f0: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2600: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2610: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2620: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2630: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2640: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2650: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2660: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
2670: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
2680: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
2690: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
26a0: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
26b0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
26c0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
26d0: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
26e0: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
26f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2700: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2720: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2730: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2740: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2750: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2760: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2770: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2780: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2790: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27a0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
27b0: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
27c0: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
27d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27e0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
27f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2800: 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44  _OMIT_SHUTDOWN_D
2810: 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f  IRECTORIES.    /
2820: 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73 79  * The heap subsy
2830: 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65  stem has now bee
2840: 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74  n shutdown and t
2850: 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20  hese values are 
2860: 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20  supposed.    ** 
2870: 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  to be NULL or po
2880: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  int to memory th
2890: 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  at was obtained 
28a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
28b0: 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68  loc(),.    ** wh
28c0: 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f  ich would rely o
28d0: 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62 73  n that heap subs
28e0: 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65  ystem; therefore
28f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73  , make sure thes
2900: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2910: 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  cannot refer to 
2920: 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74  heap memory that
2930: 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69   was just invali
2940: 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20  dated when the. 
2950: 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79     ** heap subsy
2960: 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77  stem was shutdow
2970: 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  n.  This is only
2980: 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72   done if the cur
2990: 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  rent call to.   
29a0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
29b0: 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68  n resulted in th
29c0: 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  e heap subsystem
29d0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
29e0: 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f  shutdown..    */
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74  .    sqlite3_dat
2a00: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
2a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d  .    sqlite3_tem
2a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
2a30: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2a50: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2a60: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2a70: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
2a80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2a90: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2aa0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
2ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ac0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
2ad0: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
2ae0: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
2af0: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
2b00: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
2b10: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2b20: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
2b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b40: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2b50: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
2b60: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
2b70: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
2b80: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2b90: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2ba0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2bb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
2bc0: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
2bd0: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
2be0: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
2bf0: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
2c00: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
2c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
2c20: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
2c30: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2c40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c50: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
2c60: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
2c70: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
2c80: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
2c90: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
2ca0: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
2cb0: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
2cc0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
2cd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2ce0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
2cf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
2d00: 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  T;..  va_start(a
2d10: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
2d20: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
2d30: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
2d40: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
2d50: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
2d60: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
2d70: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a     ** compile. .
2d80: 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e      */.#if defin
2d90: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
2da0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
2db0: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20 20 20  THREADSAFE>0.   
2dc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2dd0: 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
2de0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2df0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
2e00: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
2e10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2e20: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20  CoreMutex = 0;. 
2e30: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e40: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2e50: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2e60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2e80: 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20  IG_MULTITHREAD: 
2e90: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
2ea0: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64  le mutexing of d
2eb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2ec0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ons */.      /* 
2ed0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  Enable mutexing 
2ee0: 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72  of core data str
2ef0: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20  uctures */.     
2f00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f10: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f20: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f40: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f60: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f70: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
2f80: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
2f90: 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  Enable all mutex
2fa0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2fb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fc0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2fe0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ff0: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
3000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3020: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
3030: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
3040: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
3050: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
3060: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
3070: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3080: 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28  mutex = *va_arg(
3090: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
30a0: 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  x_methods*);.   
30b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30d0: 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a  CONFIG_GETMUTEX:
30e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
30f0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
3100: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
3110: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a  ation */.      *
3120: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3130: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
3140: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3150: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a  alConfig.mutex;.
3160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3170: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
3180: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3190: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
31a0: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
31b0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c   alternative mal
31c0: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
31d0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
31e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
31f0: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3200: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3210: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
3220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3230: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3240: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
3250: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3260: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c  the current mall
3270: 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74  oc() implementat
3280: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ion */.      if(
3290: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32a0: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d  nfig.m.xMalloc==
32b0: 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  0 ) sqlite3MemSe
32c0: 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20  tDefault();.    
32d0: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
32e0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
32f0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
3300: 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20  balConfig.m;.   
3310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3320: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3330: 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53  CONFIG_MEMSTATUS
3340: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
3350: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
3360: 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73  he malloc status
3370: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20   collection */. 
3380: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3390: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
33a0: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
33b0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
33c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
33d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
33e0: 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20  CRATCH: {.      
33f0: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
3400: 75 66 66 65 72 20 66 6f 72 20 73 63 72 61 74 63  uffer for scratc
3410: 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  h memory space *
3420: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
3440: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
3450: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3460: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3470: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
3480: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
34a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61  obalConfig.nScra
34b0: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
34c0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
34d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
34e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34f0: 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20  _PAGECACHE: {.  
3500: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3510: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 70 61   a buffer for pa
3520: 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 20  ge cache memory 
3530: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
3540: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3550: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
3560: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3570: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3580: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
3590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
35a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
35b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
35c0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
35d0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
35e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
35f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3600: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
3610: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
3620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3630: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3640: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a  ONFIG_GETPCACHE:
3650: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20   {.      /* now 
3660: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
3670: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3680: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
3690: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
36a0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
36b0: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
36c0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
36d0: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
36e0: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
36f0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3700: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3710: 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f  g.pcache2 = *va_
3720: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3730: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a  pcache_methods2*
3740: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3750: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3760: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3770: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
3780: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3790: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
37a0: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
37b0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
37c0: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
37d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
37e0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37f0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
3800: 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  2*) = sqlite3Glo
3810: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
3820: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
3830: 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
3840: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
3850: 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66  _MEMSYS3) || def
3860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
3870: 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20  LE_MEMSYS5).    
3880: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3890: 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20  IG_HEAP: {.     
38a0: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
38b0: 62 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20  buffer for heap 
38c0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
38d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
38e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
38f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3900: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3910: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3920: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
3930: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3940: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3950: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
3960: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
3970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
3980: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
3990: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
39a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
39b0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
39c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
39d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
39e0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
39f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
3a00: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
3a10: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
3a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3a30: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3a40: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
3a50: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3a70: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
3a80: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65      /* If the he
3a90: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55  ap pointer is NU
3aa0: 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65  LL, then restore
3ab0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c   the malloc impl
3ac0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
3ad0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55     ** back to NU
3ae0: 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e  LL pointers too.
3af0: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
3b00: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20  e the malloc to 
3b10: 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  go.        ** ba
3b20: 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  ck to its defaul
3b30: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
3b40: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
3b50: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20  itialize() is.  
3b60: 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20        ** run..  
3b70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3b80: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
3b90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
3ba0: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
3bb0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
3bc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68          /* The h
3be0: 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  eap pointer is n
3bf0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  ot NULL, then in
3c00: 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65  stall one of the
3c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35  .        ** mem5
3c20: 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64  .c/mem3.c method
3c30: 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73 69 6e  s.  The enclosin
3c40: 67 20 23 69 66 20 67 75 61 72 61 6e 74 65 65 73  g #if guarantees
3c50: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
3c60: 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 73  east one of thes
3c70: 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63 75 72  e methods is cur
3c80: 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64 2e 0a  rently enabled..
3c90: 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
3ca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3cb0: 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20  MEMSYS3.        
3cc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3cd0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
3ce0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b  MemGetMemsys3();
3cf0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3d00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
3d10: 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c  SYS5.        sql
3d20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3d30: 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d  .m = *sqlite3Mem
3d40: 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65  GetMemsys5();.#e
3d50: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
3d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
3d80: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
3d90: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
3da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3db0: 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
3dc0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3dd0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3de0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3df0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
3e00: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3e20: 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f      .    /* Reco
3e30: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
3e40: 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74  the logger funct
3e50: 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73  ion and its firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
3e70: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  ** The default i
3e80: 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67  s NULL.  Logging
3e90: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20   is disabled if 
3ea0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  the function poi
3eb0: 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e  nter is.    ** N
3ec0: 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20  IG_LOG: {.      
3ef0: 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
3f00: 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
3f10: 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
3f20: 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
3f30: 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
3f40: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
3f50: 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
3f60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3f70: 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72  fig.xLog = va_ar
3f80: 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f  g(ap, void(*)(vo
3f90: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3fa0: 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  ar*));.      */.
3fb0: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
3fc0: 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76  id(*LOGFUNC_t)(v
3fd0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
3fe0: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  har*);.      sql
3ff0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4000: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
4010: 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20  p, LOGFUNC_t);. 
4020: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4030: 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67  alConfig.pLogArg
4040: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
4050: 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  id*);.      brea
4060: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
4070: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4080: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71  _URI: {.      sq
4090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
40a0: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
40b0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
40c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
40f0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
4100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4110: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
4120: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
4130: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4140: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
4150: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
4160: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
4170: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
4180: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
4190: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
41a0: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
41b0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
41c0: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
41d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
41e0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
41f0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
4200: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4210: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4220: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
4230: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4240: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
4250: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4260: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4270: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
4280: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4290: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
42a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
42b0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
42c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
42d0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
42e0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
42f0: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  4);.      if( mx
4300: 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70  Mmap<0 || mxMmap
4310: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50  >SQLITE_MAX_MMAP
4320: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
4330: 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   mxMmap = SQLITE
4340: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a  _MAX_MMAP_SIZE;.
4350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4360: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4370: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
4380: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  p;.      if( szM
4390: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
43a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
43b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
43c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
43d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
43e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
43f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
4400: 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
4410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4420: 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
4430: 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64  S_WIN && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
4450: 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65 20 53  LLOC).    case S
4460: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
4470: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
4480: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4490: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
44a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
44b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
44c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
44d0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
44e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
44f0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
4500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
4510: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
4520: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4530: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
4540: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
4550: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4560: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
4570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4580: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
4590: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
45a0: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
45b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
45c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
45d0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
45e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
45f0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
4600: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
4610: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
4620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
4630: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
4640: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
4650: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
4660: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
4670: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4680: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4690: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
46a0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
46b0: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
46c0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
46d0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
46e0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
46f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
4700: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
4710: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
4720: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
4730: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
4740: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
4750: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4760: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4770: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4780: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
4790: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
47a0: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
47b0: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
47c0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
47d0: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
47e0: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
47f0: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
4800: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
4810: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
4820: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4830: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
4840: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
4850: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4860: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4870: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4880: 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65  kaside slot afte
4890: 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65  r ROUNDDOWN8 nee
48a0: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ds to be larger.
48b0: 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e    ** than a poin
48c0: 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c  ter to be useful
48d0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f  ..  */.  sz = RO
48e0: 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f  UNDDOWN8(sz);  /
48f0: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
4900: 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a  9382 */.  if( sz
4910: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
4920: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
4930: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4940: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4950: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4960: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4970: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4980: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4990: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
49a0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
49b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
49c0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
49d0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
49e0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
49f0: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
4a00: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4a10: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
4a20: 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20   pStart ) cnt = 
4a30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
4a40: 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20  e(pStart)/sz;.  
4a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72  }else{.    pStar
4a60: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
4a70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
4a80: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
4a90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4aa0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
4ab0: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
4ac0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
4ad0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
4ae0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
4af0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
4b00: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
4b10: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
4b20: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
4b30: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4b40: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
4b50: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
4b60: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
4b70: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
4b80: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
4b90: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4ba0: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
4bb0: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4bc0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
4bd0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
4be0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4bf0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
4c00: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
4c10: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
4c20: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4c30: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
4c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
4c50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4c60: 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  art = db;.    db
4c70: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4c80: 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c   = db;.    db->l
4c90: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4ca0: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4cb0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4cc0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
4cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4cf0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
4d00: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
4d10: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4d20: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
4d30: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
4d40: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
4d50: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
4d60: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
4d70: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
4d80: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
4d90: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
4da0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
4db0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
4dc0: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
4dd0: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
4de0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4df0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4e00: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4e10: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
4e20: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
4e30: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4e40: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
4e50: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
4e60: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
4e70: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
4e80: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
4e90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4ea0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
4eb0: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
4ec0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
4ed0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
4ee0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
4ef0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4f00: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
4f10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4f20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
4f30: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
4f40: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
4f50: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
4f60: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
4f70: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
4f80: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
4f90: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
4fa0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
4fb0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
4fc0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
4fd0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
4fe0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
4ff0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
5000: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
5010: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
5020: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
5030: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
5040: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
5050: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
5060: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
5070: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
5080: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
5090: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
50a0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
50b0: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
50c0: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
50d0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
50e0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
50f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5100: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5110: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5120: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
5130: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
5140: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
5150: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
5160: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
5170: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
5180: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
5190: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
51a0: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
51b0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
51c0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
51d0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
51e0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
51f0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
5200: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
5210: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
5220: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
5230: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
5240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5250: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
5260: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
5270: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
5280: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
5290: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
52a0: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
52b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
52c0: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
52d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
52e0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
52f0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
5300: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
5310: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
5320: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
5330: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
5340: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
5350: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
5360: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
5370: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
5380: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
5390: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
53a0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
53b0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
53c0: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
53d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
53e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
53f0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
5400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5410: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
5420: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
5430: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
5440: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5450: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
5460: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
5470: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
5480: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
5490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
54a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
54b0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
54c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
54d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
54e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
54f0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5500: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
5510: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
5520: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
5530: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
5540: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
5550: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
5560: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
5570: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
5580: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
5590: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
55a0: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
55b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
55c0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
55d0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
55e0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
55f0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
5600: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
5610: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
5620: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
5630: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
5640: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
5650: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
5660: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
5670: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
5680: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
5690: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
56a0: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
56b0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
56c0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
56d0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
56e0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
56f0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
5700: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
5710: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
5720: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
5730: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
5740: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
5750: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5760: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
5770: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
5780: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
5790: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
57a0: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
57b0: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
57c0: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
57d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
57e0: 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74   rc unchanged at
57f0: 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   0 */.    }else{
5800: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
5810: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
5820: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
5840: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
5850: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
5860: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
5870: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
5880: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
5890: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
58a0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
58b0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
58c0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
58d0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
58e0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
58f0: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
5900: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
5910: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
5920: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
5930: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
5940: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
5950: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
5960: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
5970: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
5980: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
5990: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
59a0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
59b0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
59c0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
59d0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
59e0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
59f0: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
5a00: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
5a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
5a20: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
5a30: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
5a40: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
5a50: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
5a60: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
5a70: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
5a80: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
5a90: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
5aa0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
5ab0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
5ac0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5ad0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
5ae0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
5af0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5b00: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
5b10: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
5b20: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
5b30: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5b40: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
5b50: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5b60: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
5b70: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
5b80: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5b90: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5ba0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
5bb0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
5bc0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5bd0: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
5be0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
5bf0: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
5c00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5c10: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
5c20: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5c30: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
5c40: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5c50: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
5c60: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
5c70: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
5c80: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
5c90: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5ca0: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
5cb0: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
5cc0: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
5cd0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
5ce0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
5cf0: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
5d00: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
5d10: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5d20: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5d30: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
5d40: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
5d50: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
5d60: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
5d70: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
5d80: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
5d90: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
5da0: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
5db0: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
5dc0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
5dd0: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
5de0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
5df0: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
5e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5e10: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
5e20: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
5e30: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
5e40: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
5e50: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
5e60: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
5e70: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
5e80: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
5e90: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
5ea0: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
5eb0: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
5ec0: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
5ed0: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
5ee0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
5ef0: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
5f00: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
5f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f20: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
5f30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
5f40: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
5f50: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
5f60: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
5f70: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
5f80: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
5f90: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
5fa0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
5fb0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
5fc0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
5fd0: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
5fe0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
5ff0: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
6000: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6010: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
6020: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
6030: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
6040: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61   all sqlite3_vta
6050: 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62  b objects that b
6060: 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73  elong to databas
6070: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
6080: 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  db. This is call
6090: 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65  ed when db is be
60a0: 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  ing closed..*/.s
60b0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f  tatic void disco
60c0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c  nnectAllVtab(sql
60d0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64  ite3 *db){.#ifnd
60e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
60f0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
6100: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t i;.  sqlite3Bt
6110: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6120: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6130: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6140: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6150: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
6160: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
6170: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
6180: 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  a ){.      HashE
6190: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  lem *p;.      fo
61a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
61b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
61c0: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
61d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
61e0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
61f0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
6200: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
6210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
6220: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
6230: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
6240: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
6250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6260: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
6270: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
6280: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6290: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c  eaveAll(db);.#el
62a0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
62b0: 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69  METER(db);.#endi
62c0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
62d0: 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61  n TRUE if databa
62e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
62f0: 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64   has unfinalized
6300: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6310: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6320: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6330: 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a  ckup objects.  .
6340: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
6350: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73  nnectionIsBusy(s
6360: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
6370: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
6380: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6390: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
63a0: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
63b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
63c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
63d0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; j++){.    Btr
63e0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
63f0: 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[j].pBt;.    if
6400: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6410: 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28  BtreeIsInBackup(
6420: 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  pBt) ) return 1;
6430: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6450: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
6460: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73  te database.*/.s
6470: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6480: 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  3Close(sqlite3 *
6490: 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d  db, int forceZom
64a0: 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20  bie){.  if( !db 
64b0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
64c0: 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31  CE-OF: R-63257-1
64d0: 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c  1740 Calling sql
64e0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a  ite3_close() or.
64f0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
6500: 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61  lose_v2() with a
6510: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72   NULL pointer ar
6520: 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d  gument is a harm
6530: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  less no-op. */. 
6540: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6550: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
6560: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6570: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
6580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6590: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
65a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
65b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
65c0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72  utex);..  /* For
65d0: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
65e0: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
65f0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
6600: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
6610: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
6620: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
6630: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
6640: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
6650: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
6660: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
6670: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
6680: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
6690: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
66a0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
66b0: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
66c0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
66d0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
66e0: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
66f0: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
6700: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
6710: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
6720: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
6730: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
6740: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
6750: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
6760: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
6770: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
6780: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6790: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
67a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
67b0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
67c0: 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61    /* Legacy beha
67d0: 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c  vior (sqlite3_cl
67e0: 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20  ose() behavior) 
67f0: 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  is to return.  *
6800: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  * SQLITE_BUSY if
6810: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6820: 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  can not be close
6830: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
6840: 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65   */.  if( !force
6850: 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63  Zombie && connec
6860: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
6870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6880: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
6890: 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62  LITE_BUSY, "unab
68a0: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
68b0: 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22  to unfinalized "
68c0: 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65  .       "stateme
68d0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
68e0: 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20  d backups");.   
68f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6900: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
6910: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6920: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69  TE_BUSY;.  }..#i
6930: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6940: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
6950: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
6960: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
6970: 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68     /* Closing th
6980: 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  e handle. Fourth
6990: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
69a0: 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32  ssed the value 2
69b0: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
69c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
69d0: 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62  llog(sqlite3Glob
69e0: 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
69f0: 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a  Arg, db, 0, 2);.
6a00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6a10: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e   Convert the con
6a20: 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a  nection into a z
6a30: 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63  ombie and then c
6a40: 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  lose it..  */.  
6a50: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
6a60: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b  TE_MAGIC_ZOMBIE;
6a70: 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  .  sqlite3LeaveM
6a80: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6a90: 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ie(db);.  return
6aa0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6ab0: 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69  *.** Two variati
6ac0: 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69  ons on the publi
6ad0: 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  c interface for 
6ae0: 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61  closing a databa
6af0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
6b00: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c  . The sqlite3_cl
6b10: 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65  ose() version re
6b20: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
6b30: 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20  Y and.** leaves 
6b40: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
6b50: 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ption if there a
6b60: 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  re unfinalized p
6b70: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
6b80: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6b90: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
6ba0: 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ups.  The sqlite
6bb0: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20  3_close_v2().** 
6bc0: 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74  version forces t
6bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
6be0: 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65   become a zombie
6bf0: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
6c00: 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72   unclosed resour
6c10: 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65  ces, and arrange
6c20: 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69  s for deallocati
6c30: 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  on when the last
6c40: 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74  .** prepare stat
6c50: 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33  ement or sqlite3
6c60: 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a  _backup closes..
6c70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
6c80: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
6c90: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6ca0: 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a  3Close(db,0); }.
6cb0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
6cc0: 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62  e_v2(sqlite3 *db
6cd0: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6ce0: 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a  3Close(db,1); }.
6cf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
6d00: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
6d10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6d20: 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72  b..**.** Further
6d30: 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73  more, if databas
6d40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
6d50: 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61  is a zombie (mea
6d60: 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a  ning that there.
6d70: 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  ** has been a pr
6d80: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
6d90: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72  te3_close(db) or
6da0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6db0: 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76  2(db)) and.** ev
6dc0: 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ery sqlite3_stmt
6dd0: 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69   has now been fi
6de0: 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72  nalized and ever
6df0: 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  y sqlite3_backup
6e00: 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64   has.** finished
6e10: 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20  , then free all 
6e20: 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f  resources..*/.vo
6e30: 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  id sqlite3LeaveM
6e40: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6e50: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ie(sqlite3 *db){
6e60: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20  .  HashElem *i; 
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
6e90: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
6ea0: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt j;..  /* If t
6eb0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
6ec0: 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d  ding sqlite3_stm
6ed0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
6ee0: 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a  kup objects.  **
6ef0: 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65   or if the conne
6f00: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  ction has not ye
6f10: 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79  t been closed by
6f20: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6f30: 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a  2(),.  ** then j
6f40: 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75  ust leave the mu
6f50: 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  tex and return..
6f60: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
6f70: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
6f80: 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e  IC_ZOMBIE || con
6f90: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
6fa0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
6fb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
6fc0: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
6fd0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  urn;.  }..  /* I
6fe0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
6ff0: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
7000: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
7010: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
7020: 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c  .  ** closed all
7030: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e   sqlite3_stmt an
7040: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
7050: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73   objects and has
7060: 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65   been.  ** passe
7070: 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d to sqlite3_clo
7080: 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  se (meaning that
7090: 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29   it is a zombie)
70a0: 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20  .  Therefore,.  
70b0: 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
70c0: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
70d0: 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49  es..  */..  /* I
70e0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
70f0: 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74  is open, roll it
7100: 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f   back. This also
7110: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66   ensures that if
7120: 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61  .  ** any databa
7130: 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20  se schemas have 
7140: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79  been modified by
7150: 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20   an uncommitted 
7160: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
7170: 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e   they are reset.
7180: 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65   And that the re
7190: 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75  quired b-tree mu
71a0: 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d  tex is held to m
71b0: 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ake.  ** the pag
71c0: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  er rollback and 
71d0: 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20  schema reset an 
71e0: 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e  atomic operation
71f0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f  . */.  sqlite3Ro
7200: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
7210: 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20  LITE_OK);..  /* 
7220: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
7230: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
7240: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
7250: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
7260: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f  points(db);..  /
7270: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61  * Close all data
7280: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
7290: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
72a0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
72b0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
72c0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
72d0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
72e0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
72f0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
7300: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
7310: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
7320: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
7330: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
7340: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
7350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
7360: 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73  Clear the TEMP s
7370: 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79  chema separately
7380: 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69   and last */.  i
7390: 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  f( db->aDb[1].pS
73a0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c  chema ){.    sql
73b0: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
73c0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
73d0: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
73e0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
73f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  (db);..  /* Free
7400: 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
7410: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
7420: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
7430: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
7440: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73  eArray(db);.  as
7450: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
7460: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
7470: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
7480: 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65  atic );..  /* Te
7490: 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e  ll the code in n
74a0: 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65  otify.c that the
74b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c   connection no l
74c0: 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a  onger holds any.
74d0: 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64    ** locks and d
74e0: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
74f0: 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f  any further unlo
7500: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
7510: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
7520: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f  te3ConnectionClo
7530: 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  sed(db);..  for(
7540: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
7550: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
7560: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
7570: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
7580: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
7590: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
75a0: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
75b0: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
75c0: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
75d0: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
75e0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
75f0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
7600: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
7610: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7620: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7630: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
7640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7650: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
7660: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7670: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
7680: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
7690: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
76a0: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
76b0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
76c0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
76d0: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
76e0: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
76f0: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
7700: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
7710: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
7720: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
7730: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
7740: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
7750: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
7760: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
7770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7780: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7790: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
77a0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
77b0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
77c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
77d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
77e0: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
77f0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7800: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
7810: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
7820: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
7830: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
7840: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
7850: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
7860: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
7870: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
7880: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
7890: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
78a0: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
78b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
78c0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
78d0: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
78e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
78f0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f  b, SQLITE_OK); /
7900: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
7910: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
7920: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
7930: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
7940: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
7950: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
7960: 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54  s(db);.#if SQLIT
7970: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
7980: 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
7990: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
79a0: 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69  uthUser);.  sqli
79b0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
79c0: 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64  h.zAuthPW);.#end
79d0: 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  if..  db->magic 
79e0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
79f0: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
7a00: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
7a10: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
7a20: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
7a30: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
7a40: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
7a50: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
7a60: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
7a70: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
7a80: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
7a90: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
7aa0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
7ab0: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
7ac0: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
7ad0: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
7ae0: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
7af0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
7b00: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
7b10: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
7b20: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
7b30: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
7b40: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
7b50: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
7b60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7b70: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
7b80: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
7b90: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
7ba0: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
7bb0: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
7bc0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
7bd0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
7be0: 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61  Out==0 );  /* Fa
7bf0: 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69  ils on a lookasi
7c00: 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a  de memory leak *
7c10: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
7c20: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
7c30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
7c40: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
7c50: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
7c60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
7c70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
7c80: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
7c90: 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69  e files.  If tri
7ca0: 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
7cb0: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20  ITE_OK, then.** 
7cc0: 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  any open cursors
7cd0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
7ce0: 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73   ("tripped" - as
7cf0: 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20   in "tripping a 
7d00: 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b  circuit.** break
7d10: 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f  er") and made to
7d20: 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65   return tripCode
7d30: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
7d40: 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74  y further.** att
7d50: 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61  empts to use tha
7d60: 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  t cursor..*/.voi
7d70: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
7d80: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
7d90: 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
7da0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7db0: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61  inTrans = 0;.  a
7dc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7dd0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
7de0: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
7df0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
7e00: 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  oc();..  /* Obta
7e10: 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75  in all b-tree mu
7e20: 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b  texes before mak
7e30: 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  ing any calls to
7e40: 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
7e50: 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  . .  ** This is 
7e60: 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73  important in cas
7e70: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
7e80: 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  n being rolled b
7e90: 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64  ack has.  ** mod
7ea0: 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
7eb0: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68  se schema. If th
7ec0: 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  e b-tree mutexes
7ed0: 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20   are not taken. 
7ee0: 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61   ** here, then a
7ef0: 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61  nother shared-ca
7f00: 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  che connection m
7f10: 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65  ight sneak in be
7f20: 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64  tween.  ** the d
7f30: 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b  atabase rollback
7f40: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
7f50: 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75  t, which can cau
7f60: 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f  se false.  ** co
7f70: 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73  rruption reports
7f80: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20   in some cases. 
7f90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
7fa0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
7fb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
7fc0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
7fd0: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
7fe0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
7ff0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69  if( p ){.      i
8000: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
8010: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
8020: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
8030: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
8040: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
8050: 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f  llback(p, tripCo
8060: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
8070: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
8080: 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69  back(db);.  sqli
8090: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
80a0: 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64 62  oc();..  if( (db
80b0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
80c0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30  nternChanges)!=0
80d0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
80e0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
80f0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
8100: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
8110: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
8120: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
8130: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
8140: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
8150: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
8160: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
8170: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
8180: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
8190: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
81a0: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
81b0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
81c0: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
81d0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
81e0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
81f0: 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  erFKs;..  /* If 
8200: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
8210: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
8220: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
8230: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
8240: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
8250: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
8260: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
8270: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
8280: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
8290: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
82a0: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
82b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
82c0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f  static string co
82d0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
82e0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
82f0: 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  to the error cod
8300: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69  e.** specified i
8310: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
8320: 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28  */.#if (defined(
8330: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
8340: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 29 20   SQLITE_OS_WIN) 
8350: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
8360: 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20 63 68  E_TEST).const ch
8370: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
8380: 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f  me(int rc){.  co
8390: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
83a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72  = 0;.  int i, or
83b0: 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72  igRc = rc;.  for
83c0: 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61  (i=0; i<2 && zNa
83d0: 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26  me==0; i++, rc &
83e0: 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69  = 0xff){.    swi
83f0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20  tch( rc ){.     
8400: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8430: 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20  _OK";           
8440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
8460: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
8470: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8480: 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20  E_ERROR";       
8490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
84a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
84b0: 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20  NTERNAL:        
84c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
84d0: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
84e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
84f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8500: 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20  PERM:           
8510: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8520: 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20  ITE_PERM";      
8530: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8540: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8550: 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20  _ABORT:         
8560: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8570: 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20  LITE_ABORT";    
8580: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8590: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
85a0: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
85b0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
85c0: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
85d0: 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b  BACK";    break;
85e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
85f0: 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20  TE_BUSY:        
8600: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8610: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
8620: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8630: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8640: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
8650: 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  Y:      zName = 
8660: 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43  "SQLITE_BUSY_REC
8670: 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72 65 61  OVERY";     brea
8680: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8690: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
86a0: 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  OT:      zName =
86b0: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e   "SQLITE_BUSY_SN
86c0: 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65  APSHOT";     bre
86d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
86e0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
86f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8700: 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  = "SQLITE_LOCKED
8710: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
8720: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8730: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
8740: 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65  AREDCACHE: zName
8750: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
8760: 44 5f 53 48 41 52 45 44 43 41 43 48 45 22 3b 62  D_SHAREDCACHE";b
8770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8780: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20   SQLITE_NOMEM:  
8790: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
87a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  e = "SQLITE_NOME
87b0: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
87c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
87d0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
87e0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  Y:           zNa
87f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
8800: 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20  DONLY";         
8810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8820: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
8830: 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e  LY_RECOVERY:  zN
8840: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
8850: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22  ADONLY_RECOVERY"
8860: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
8870: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
8880: 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a  NLY_CANTLOCK:  z
8890: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
88a0: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
88b0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
88c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
88d0: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  ONLY_ROLLBACK:  
88e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
88f0: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
8900: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
8910: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
8920: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20  DONLY_DBMOVED:  
8930: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8940: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
8950: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
8960: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
8970: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
8980: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8990: 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20  E_INTERRUPT";   
89a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
89b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
89c0: 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20  OERR:           
89d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
89e0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
89f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8a00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8a10: 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20  IOERR_READ:     
8a20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8a30: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b  ITE_IOERR_READ";
8a40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8a50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8a60: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
8a70: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
8a80: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
8a90: 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a  _READ";  break;.
8aa0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8ab0: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20  E_IOERR_WRITE:  
8ac0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8ad0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
8ae0: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
8af0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8b00: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20  TE_IOERR_FSYNC: 
8b10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8b20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
8b30: 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  NC";       break
8b40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8b50: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
8b60: 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  YNC:    zName = 
8b70: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
8b80: 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61  R_FSYNC";   brea
8b90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8ba0: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
8bb0: 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATE:     zName =
8bc0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54   "SQLITE_IOERR_T
8bd0: 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65  RUNCATE";    bre
8be0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8bf0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
8c00: 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  T:        zName 
8c10: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8c20: 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72  FSTAT";       br
8c30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8c40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
8c50: 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  OCK:       zName
8c60: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8c70: 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62  _UNLOCK";      b
8c80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8c90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
8ca0: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
8cb0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8cc0: 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_RDLOCK";      
8cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8ce0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
8cf0: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61  ELETE:       zNa
8d00: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8d10: 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20  RR_DELETE";     
8d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8d30: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8d40: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e  NOMEM:        zN
8d50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8d60: 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ERR_NOMEM";     
8d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8d80: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8d90: 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a  _ACCESS:       z
8da0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8db0: 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20  OERR_ACCESS";   
8dc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8dd0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8de0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
8df0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OCK:.           
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8e20: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
8e30: 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62  RESERVEDLOCK"; b
8e40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8e50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
8e60: 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  CK:         zNam
8e70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8e80: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
8e90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8ea0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
8eb0: 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  LOSE:        zNa
8ec0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8ed0: 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20  RR_CLOSE";      
8ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8ef0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8f00: 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e  DIR_CLOSE:    zN
8f10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8f20: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20  ERR_DIR_CLOSE"; 
8f30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8f40: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8f50: 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a  _SHMOPEN:      z
8f60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8f70: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20  OERR_SHMOPEN";  
8f80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f90: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8fa0: 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20  R_SHMSIZE:      
8fb0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8fc0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20  IOERR_SHMSIZE"; 
8fd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8fe0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8ff0: 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20  RR_SHMLOCK:     
9000: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9010: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b  _IOERR_SHMLOCK";
9020: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
9040: 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20  ERR_SHMMAP:     
9050: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9060: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b  E_IOERR_SHMMAP";
9070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9080: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
9090: 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20  OERR_SEEK:      
90a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
90b0: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20  TE_IOERR_SEEK"; 
90c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
90d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
90e0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
90f0: 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  NT: zName = "SQL
9100: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
9110: 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20  _NOENT";break;. 
9120: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9130: 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20  _IOERR_MMAP:    
9140: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9150: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22  LITE_IOERR_MMAP"
9160: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
9170: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9180: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
9190: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
91a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
91b0: 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  EMPPATH"; break;
91c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
91d0: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
91e0: 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  H:     zName = "
91f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
9200: 56 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b  VPATH";    break
9210: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9220: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
9230: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9240: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22  "SQLITE_CORRUPT"
9250: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
9260: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9270: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
9280: 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  B:       zName =
9290: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
92a0: 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65  _VTAB";      bre
92b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
92c0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
92d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
92e0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  = "SQLITE_NOTFOU
92f0: 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  ND";          br
9300: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9310: 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20  SQLITE_FULL:    
9320: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9330: 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22   = "SQLITE_FULL"
9340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
9350: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9360: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9370: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
9380: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
9390: 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20  OPEN";          
93a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
93b0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
93c0: 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61  N_NOTEMPDIR: zNa
93d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
93e0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22  TOPEN_NOTEMPDIR"
93f0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
9400: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
9410: 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e  EN_ISDIR:     zN
9420: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
9430: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20  NTOPEN_ISDIR";  
9440: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9450: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
9460: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a  PEN_FULLPATH:  z
9470: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9480: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
9490: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
94a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
94b0: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OPEN_CONVPATH:  
94c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
94d0: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
94e0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
94f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
9500: 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20  TOCOL:          
9510: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9520: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20  _PROTOCOL";     
9530: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9540: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
9550: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
9560: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9570: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
9580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9590: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
95a0: 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20  CHEMA:          
95b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
95c0: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
95d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
95e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
95f0: 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20  TOOBIG:         
9600: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9610: 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20  ITE_TOOBIG";    
9620: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9630: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9640: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20  _CONSTRAINT:    
9650: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9660: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
9670: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
9680: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9690: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
96a0: 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  QUE:  zName = "S
96b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
96c0: 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b  _UNIQUE"; break;
96d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
96e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
96f0: 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  IGGER: zName = "
9700: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9710: 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b  T_TRIGGER";break
9720: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9730: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
9740: 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20  OREIGNKEY:.     
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9770: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
9780: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
9790: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
97a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
97b0: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20  NSTRAINT_CHECK: 
97c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
97d0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
97e0: 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CK";  break;.   
97f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9800: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
9810: 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  YKEY:.          
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9840: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9850: 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20  _PRIMARYKEY";   
9860: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9870: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9880: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61  INT_NOTNULL: zNa
9890: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
98a0: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22  STRAINT_NOTNULL"
98b0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
98c0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
98d0: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a  AINT_COMMITHOOK:
98e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9910: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
9920: 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b  ITHOOK";   break
9930: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9940: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
9950: 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TAB:    zName = 
9960: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
9970: 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61  NT_VTAB";   brea
9980: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9990: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
99a0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
99d0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
99e0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20  AINT_FUNCTION"; 
99f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9a00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9a10: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20  STRAINT_ROWID:  
9a20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a30: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
9a40: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
9a50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
9a60: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
9a70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9a80: 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20  E_MISMATCH";    
9a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9aa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
9ab0: 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20  ISUSE:          
9ac0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9ad0: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
9ae0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9af0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9b00: 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20  NOLFS:          
9b10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9b20: 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20  ITE_NOLFS";     
9b30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9b40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9b50: 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20  _AUTH:          
9b60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9b70: 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20  LITE_AUTH";     
9b80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9b90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9ba0: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20  E_FORMAT:       
9bb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9bc0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20  QLITE_FORMAT";  
9bd0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9be0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9bf0: 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20  TE_RANGE:       
9c00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9c10: 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20  SQLITE_RANGE";  
9c20: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9c30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9c40: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
9c50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9c60: 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b  "SQLITE_NOTADB";
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9c80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9c90: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
9ca0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9cb0: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20   "SQLITE_ROW";  
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9cd0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9ce0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20  QLITE_NOTICE:   
9cf0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9d00: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
9d10: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9d20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9d30: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9d40: 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65  COVER_WAL: zName
9d50: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
9d60: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62  E_RECOVER_WAL";b
9d70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9d80: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
9d90: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a  ECOVER_ROLLBACK:
9da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9dd0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
9de0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
9df0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9e00: 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20  ITE_WARNING:    
9e10: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9e20: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22  "SQLITE_WARNING"
9e30: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
9e40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9e50: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
9e60: 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d  OINDEX:  zName =
9e70: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
9e80: 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65  _AUTOINDEX"; bre
9e90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9ea0: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
9eb0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9ec0: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b  = "SQLITE_DONE";
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
9ee0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
9ef0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
9f00: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
9f10: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
9f20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9f30: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
9f40: 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e  uf, "SQLITE_UNKN
9f50: 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63  OWN(%d)", origRc
9f60: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a  );.    zName = z
9f70: 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Buf;.  }.  retur
9f80: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
9f90: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
9fa0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
9fb0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
9fc0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
9fd0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
9fe0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
9ff0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
a000: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
a010: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
a020: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
a030: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
a040: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
a050: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
a060: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
a070: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
a080: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
a090: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
a0a0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
a0b0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
a0c0: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
a0d0: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
a0e0: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
a0f0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
a100: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a110: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
a120: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
a130: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
a140: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
a150: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
a160: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
a170: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
a180: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
a190: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
a1a0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
a1b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
a1c0: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
a1d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
a1e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
a1f0: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
a200: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
a210: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
a220: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a230: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
a240: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
a250: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
a260: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
a270: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
a280: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
a290: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
a2a0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
a2b0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
a2c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
a2d0: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
a2e0: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
a2f0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
a300: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
a310: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
a320: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
a330: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
a340: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
a350: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
a360: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
a370: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
a380: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
a390: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
a3a0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
a3b0: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
a3c0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
a3d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
a3e0: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
a3f0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
a400: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
a410: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
a420: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
a430: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
a440: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a450: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
a460: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
a470: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a480: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
a490: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
a4a0: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
a4b0: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
a4c0: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
a4d0: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
a4e0: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
a4f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
a500: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
a510: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
a520: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
a530: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
a540: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
a550: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
a560: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
a570: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
a580: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
a590: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
a5a0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
a5b0: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
a5c0: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
a5d0: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
a5e0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a5f0: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
a600: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
a610: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
a620: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
a630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
a640: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
a650: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
a660: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
a670: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
a680: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
a690: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
a6a0: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
a6b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a6c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
a6d0: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
a6e0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
a6f0: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
a700: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
a710: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
a720: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
a730: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
a740: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a750: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a760: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
a770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
a780: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
a790: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
a7a0: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
a7b0: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
a7c0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
a7d0: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
a7e0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
a7f0: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
a800: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
a810: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
a820: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
a830: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a840: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
a850: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
a860: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
a870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a880: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a890: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
a8c0: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
a8d0: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
a8e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
a8f0: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
a900: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
a910: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
a920: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
a930: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
a940: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
a950: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
a960: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
a970: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
a980: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
a990: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
a9a0: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
a9b0: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
a9c0: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
a9d0: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
a9e0: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
a9f0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
aa00: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
aa10: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
aa20: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
aa30: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
aa40: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
aa50: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
aa60: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
aa70: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
aa80: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
aa90: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
aaa0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
aab0: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
aac0: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
aad0: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
aae0: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
aaf0: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
ab00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
ab10: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
ab20: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
ab30: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
ab40: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
ab50: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
ab60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
ab70: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
ab80: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
ab90: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
aba0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
abb0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
abc0: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
abd0: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
abe0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
abf0: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
ac00: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
ac10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ac20: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
ac30: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
ac40: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
ac50: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
ac60: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
ac70: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
ac80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ac90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
aca0: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
acb0: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
acc0: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
acd0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
ace0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
acf0: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
ad00: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
ad10: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
ad20: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
ad30: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
ad40: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
ad50: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
ad60: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
ad70: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
ad80: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
ad90: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
ada0: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
adb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
adc0: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
add0: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
ade0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
adf0: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
ae00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
ae10: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
ae20: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
ae30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ae40: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
ae50: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
ae60: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
ae70: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
ae80: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
ae90: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
aea0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
aeb0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
aec0: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
aed0: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
aee0: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
aef0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
af00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
af10: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
af20: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
af30: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
af40: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
af50: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
af60: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
af70: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
af80: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
af90: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
afa0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
afb0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
afc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
afd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
afe0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
aff0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
b000: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
b010: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
b020: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
b030: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
b040: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
b050: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
b060: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
b070: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
b080: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
b090: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
b0a0: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
b0b0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
b0c0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
b0d0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
b0e0: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
b0f0: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
b100: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
b110: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
b120: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b130: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
b140: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
b150: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
b160: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
b170: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
b180: 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e  ps = (unsigned)n
b190: 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  Ops;.    db->pPr
b1a0: 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67  ogressArg = pArg
b1b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
b1c0: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30  b->xProgress = 0
b1d0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
b1e0: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
b1f0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
b200: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
b210: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
b220: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  db->mutex);.}.#e
b230: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
b240: 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c  s routine instal
b250: 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73  ls a default bus
b260: 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77  y handler that w
b270: 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  aits for the.** 
b280: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
b290: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
b2a0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
b2b0: 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  g 0..*/.int sqli
b2c0: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
b2d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
b2e0: 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e  t ms){.  if( ms>
b2f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b300: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
b310: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
b320: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
b330: 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d  id*)db);.    db-
b340: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
b350: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
b360: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
b370: 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a  dler(db, 0, 0);.
b380: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b390: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b3a0: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
b3b0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
b3c0: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
b3d0: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
b3e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b3f0: 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69  3_interrupt(sqli
b400: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
b410: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
b420: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
b430: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b440: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
b450: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
b460: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
b470: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
b480: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
b490: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
b4a0: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
b4b0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
b4c0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
b4d0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
b4e0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
b4f0: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
b500: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
b510: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
b520: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
b530: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
b540: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
b550: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
b560: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
b570: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
b580: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
b590: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
b5a0: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
b5b0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
b5c0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
b5d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
b5e0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
b5f0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
b600: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
b610: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
b620: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
b630: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
b640: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
b650: 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20  pDestructor.){. 
b660: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
b670: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  nt nName;.  int 
b680: 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61  extraFlags;..  a
b690: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b6a0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
b6b0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
b6c0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
b6d0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
b6e0: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
b6f0: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
b700: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
b710: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
b720: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
b730: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
b740: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
b750: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
b760: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
b770: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
b780: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
b790: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b7a0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
b7b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b7c0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
b7d0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  PT;.  }..  asser
b7e0: 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  t( SQLITE_FUNC_C
b7f0: 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f  ONSTANT==SQLITE_
b800: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
b810: 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20  .  extraFlags = 
b820: 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45  enc &  SQLITE_DE
b830: 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65  TERMINISTIC;.  e
b840: 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55  nc &= (SQLITE_FU
b850: 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54  NC_ENCMASK|SQLIT
b860: 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64  E_ANY);.  .#ifnd
b870: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
b880: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
b890: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
b8a0: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
b8b0: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
b8c0: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
b8d0: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
b8e0: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
b8f0: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
b900: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
b910: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
b920: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
b930: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
b940: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
b950: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
b960: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
b970: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
b980: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
b990: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
b9a0: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
b9b0: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
b9c0: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
b9d0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
b9e0: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
b9f0: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
ba00: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
ba10: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
ba20: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
ba30: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
ba40: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
ba50: 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  TF8|extraFlags,.
ba60: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
ba70: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
ba80: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
ba90: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
baa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bab0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
bac0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
bad0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
bae0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
baf0: 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73  F16LE|extraFlags
bb00: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
bb10: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
bb20: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
bb30: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
bb40: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
bb50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
bb60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
bb70: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
bb80: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
bb90: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
bba0: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
bbb0: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
bbc0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
bbd0: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
bbe0: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
bbf0: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
bc00: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
bc10: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
bc20: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
bc30: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
bc40: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
bc50: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
bc60: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
bc70: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
bc80: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
bc90: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
bca0: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
bcb0: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
bcc0: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
bcd0: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
bce0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
bcf0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
bd00: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
bd10: 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20   (u8)enc, 0);.  
bd20: 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e  if( p && (p->fun
bd30: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
bd40: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65  FUNC_ENCMASK)==e
bd50: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
bd60: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
bd70: 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
bd80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
bd90: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
bda0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
bdb0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
bdc0: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
bdd0: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
bde0: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
bdf0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
be00: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
be10: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
be20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
be30: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
be40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
be50: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
be60: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
be70: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
be80: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
be90: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
bea0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
beb0: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
bec0: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
bed0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
bee0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
bef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bf00: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
bf10: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
bf20: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
bf30: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
bf40: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
bf50: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
bf60: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
bf70: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
bf80: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
bf90: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
bfa0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
bfb0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
bfc0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
bfd0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
bfe0: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
bff0: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
c000: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
c010: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
c020: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
c030: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
c040: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
c050: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
c060: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
c070: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
c080: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
c090: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
c0a0: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
c0b0: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
c0c0: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
c0d0: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
c0e0: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
c0f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c100: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
c110: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
c120: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
c130: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
c140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
c150: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
c160: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
c170: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
c180: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
c190: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
c1a0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
c1b0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
c1c0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c1d0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c1e0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
c1f0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
c200: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
c210: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
c220: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
c230: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
c240: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
c250: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
c260: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
c290: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
c2a0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c2b0: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
c2c0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
c2d0: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
c2e0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
c2f0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
c300: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c310: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c320: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c330: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
c340: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
c350: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c360: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
c370: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
c380: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
c390: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
c3a0: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
c3b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c3c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
c3d0: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
c3e0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
c3f0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
c400: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
c410: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
c420: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
c430: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
c440: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c450: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
c460: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
c470: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
c480: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
c490: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
c4a0: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
c4b0: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
c4c0: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
c4d0: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
c4e0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
c4f0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
c500: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
c510: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
c520: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
c530: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
c540: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
c550: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c560: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
c570: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
c580: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c590: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
c5a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
c5b0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
c5c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c5d0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
c5e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c5f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c600: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
c610: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c620: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
c630: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
c640: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
c650: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
c660: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
c670: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
c680: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c690: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c6a0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c6b0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
c6c0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
c6d0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c6e0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c6f0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
c700: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
c710: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
c720: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
c730: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c740: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c750: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
c760: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
c770: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
c780: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
c790: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
c7a0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c7b0: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
c7c0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c7d0: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
c7e0: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
c7f0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
c800: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
c810: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
c820: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c830: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
c840: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c850: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
c860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c870: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c880: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
c890: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
c8a0: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
c8b0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
c8c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
c8d0: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
c8e0: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
c8f0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
c900: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
c910: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
c920: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
c930: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
c940: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
c950: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
c960: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
c970: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
c980: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
c990: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
c9a0: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
c9b0: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
c9c0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
c9d0: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
c9e0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
c9f0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
ca00: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
ca10: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
ca20: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
ca30: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
ca40: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
ca50: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
ca60: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
ca70: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
ca80: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
ca90: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
caa0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
cab0: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
cac0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
cad0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
cae0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
caf0: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
cb00: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cb10: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
cb20: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
cb30: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
cb40: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
cb50: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
cb60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cb70: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
cb80: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
cb90: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
cbc0: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
cbd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
cbe0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
cbf0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
cc00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
cc10: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
cc20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
cc30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cc40: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
cc50: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
cc60: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
cc70: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
cc80: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
cc90: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
cca0: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
ccb0: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
ccc0: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
ccd0: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
cce0: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
ccf0: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
cd00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
cd10: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
cd20: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
cd30: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
cd40: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
cd50: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
cd60: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
cd70: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
cd80: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
cd90: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
cda0: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
cdb0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
cdc0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cdd0: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
cde0: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
cdf0: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
ce00: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
ce10: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
ce20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ce30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ce40: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
ce50: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
ce60: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
ce70: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
ce80: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
ce90: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
cea0: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
ceb0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
cec0: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
ced0: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
cee0: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
cef0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
cf00: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
cf10: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
cf20: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
cf30: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
cf40: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
cf50: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
cf60: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
cf70: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
cf80: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
cf90: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
cfa0: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
cfb0: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
cfc0: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
cfd0: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
cfe0: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
cff0: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
d000: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
d010: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
d020: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
d030: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
d040: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
d050: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
d060: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d070: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d080: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d090: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
d0a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d0b0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
d0c0: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
d0d0: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
d0e0: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
d0f0: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
d100: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
d110: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d120: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
d130: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
d140: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
d150: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
d160: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
d170: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d190: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
d1a0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
d1b0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
d1c0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
d1d0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
d1e0: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
d1f0: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
d200: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
d210: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
d220: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
d230: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
d240: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
d250: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d260: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
d270: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
d280: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d290: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
d2a0: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
d2b0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
d2c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d2d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
d2e0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
d2f0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d300: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
d310: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
d320: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
d330: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
d340: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
d350: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
d360: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
d370: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
d380: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
d390: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d3a0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d3b0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d3c0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d3d0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d3e0: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
d3f0: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
d400: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
d410: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d430: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
d440: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
d450: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
d460: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d470: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d480: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
d490: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
d4a0: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
d4b0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
d4c0: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
d4d0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
d4e0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d4f0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d500: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
d510: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
d520: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
d530: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
d540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
d550: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
d560: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
d570: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
d580: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
d590: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
d5a0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d5b0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d5c0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d5d0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d5e0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d5f0: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
d600: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
d610: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d630: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d640: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d650: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
d660: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d670: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d680: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
d690: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
d6a0: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
d6b0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
d6c0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
d6d0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d6e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d6f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d700: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64  rn pRet;.}..#ifd
d710: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d720: 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
d730: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
d740: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
d750: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
d760: 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74  e a row is updat
d770: 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  ed,.** inserted 
d780: 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  or deleted using
d790: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
d7a0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
d7b0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75  id *sqlite3_preu
d7c0: 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
d7d0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
d7e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
d7f0: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
d800: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
d810: 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b   void(*xCallback
d820: 29 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  )(         /* Ca
d830: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
d840: 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c  */.    void*,sql
d850: 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63  ite3*,int,char c
d860: 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74  onst*,char const
d870: 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  *,sqlite3_int64,
d880: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a  sqlite3_int64),.
d890: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d8b0: 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72  irst callback ar
d8c0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76  gument */.){.  v
d8d0: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
d8e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d8f0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d900: 52 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70  Ret = db->pPreUp
d910: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
d920: 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
d930: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
d940: 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41   db->pPreUpdateA
d950: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
d960: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d970: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
d980: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
d990: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
d9a0: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
d9b0: 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HOOK */..#ifndef
d9c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
d9d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
d9e0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
d9f0: 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
da00: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c  d by sqlite3_wal
da10: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
da20: 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  )..** Invoke sql
da30: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
da40: 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  int if the numbe
da50: 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
da60: 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69  he log file.** i
da70: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  s greater than s
da80: 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63  qlite3.pWalArg c
da90: 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ast to an intege
daa0: 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  r (the value con
dab0: 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61  figured by.** wa
dac0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
dad0: 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ())..*/ .int sql
dae0: 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
daf0: 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69  ok(.  void *pCli
db00: 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
db10: 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  Argument */.  sq
db20: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
db30: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
db40: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
db50: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f  ar *zDb,       /
db60: 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  * Database */.  
db70: 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20  int nFrame      
db80: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
db90: 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66  f WAL */.){.  if
dba0: 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45  ( nFrame>=SQLITE
dbb0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69  _PTR_TO_INT(pCli
dbc0: 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20  entData) ){.    
dbd0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
dbe0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
dbf0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
dc00: 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
dc10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
dc20: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
dc30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
dc40: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
dc50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
dc60: 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  AL */../*.** Con
dc70: 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65  figure an sqlite
dc80: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
dc90: 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74  lback to automat
dca0: 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e  ically checkpoin
dcb0: 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  t.** a database 
dcc0: 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67  after committing
dcd0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
dce0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61  f there are nFra
dcf0: 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72  me or.** more fr
dd00: 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
dd10: 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65  file. Passing ze
dd20: 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65  ro or a negative
dd30: 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a   value as the.**
dd40: 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65   nFrame paramete
dd50: 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d  r disables autom
dd60: 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73  atic checkpoints
dd70: 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a   entirely..**.**
dd80: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65   The callback re
dd90: 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73  gistered by this
dda0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63   function replac
ddb0: 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  es any existing 
ddc0: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69  callback.** regi
ddd0: 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c  stered using sql
dde0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e  ite3_wal_hook().
ddf0: 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73   Likewise, regis
de00: 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63  tering a callbac
de10: 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74  k.** using sqlit
de20: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69  e3_wal_hook() di
de30: 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d  sables the autom
de40: 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20  atic checkpoint 
de50: 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e  mechanism.** con
de60: 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20  figured by this 
de70: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
de80: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
de90: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  ocheckpoint(sqli
dea0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72  te3 *db, int nFr
deb0: 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ame){.#ifdef SQL
dec0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55  ITE_OMIT_WAL.  U
ded0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
dee0: 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
def0: 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b  RAMETER(nFrame);
df00: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 46 72  .#else.  if( nFr
df10: 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ame>0 ){.    sql
df20: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
df30: 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  , sqlite3WalDefa
df40: 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f  ultHook, SQLITE_
df50: 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d  INT_TO_PTR(nFram
df60: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
df70: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
df80: 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  ok(db, 0, 0);.  
df90: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
dfa0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
dfb0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
dfc0: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
dfd0: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
dfe0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
dff0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
e000: 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  to the write-ahe
e010: 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64  ad-log by this d
e020: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e030: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
e040: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20  ite3_wal_hook(. 
e050: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
e080: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68  ook to this db h
e090: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a  andle */.  int(*
e0a0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
e0b0: 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e  *, sqlite3*, con
e0c0: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a  st char*, int),.
e0d0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
e100: 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43  ent passed to xC
e110: 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a  allback() */.){.
e120: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e130: 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a  MIT_WAL.  void *
e140: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
e150: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e160: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
e170: 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
e180: 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
e190: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
e1a0: 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
e1b0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
e1c0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
e1d0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
e1e0: 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
e1f0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
e200: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
e210: 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a  t database zDb..
e220: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
e230: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
e240: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
e270: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
e280: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
e290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e2a0: 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20  ame of attached 
e2b0: 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c  database (or NUL
e2c0: 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64  L) */.  int eMod
e2d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e2e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
e2f0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76  E_CHECKPOINT_* v
e300: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
e310: 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20  nLog,           
e320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
e330: 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f  : Size of WAL lo
e340: 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20  g in frames */. 
e350: 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20   int *pnCkpt    
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e   /* OUT: Total n
e380: 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
e390: 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a  checkpointed */.
e3a0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
e3b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75  _OMIT_WAL.  retu
e3c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
e3d0: 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  lse.  int rc;   
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e400: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  code */.  int iD
e410: 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  b = SQLITE_MAX_A
e420: 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c  TTACHED;  /* sql
e430: 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78  ite3.aDb[] index
e440: 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70   of db to checkp
e450: 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e  oint */..  /* In
e460: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74  itialize the out
e470: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f  put variables to
e480: 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65   -1 in case an e
e490: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
e4a0: 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70    if( pnLog ) *p
e4b0: 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28  nLog = -1;.  if(
e4c0: 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70   pnCkpt ) *pnCkp
e4d0: 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72  t = -1;..  asser
e4e0: 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
e4f0: 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c 49 54 45  OINT_FULL>SQLITE
e500: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
e510: 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
e520: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
e530: 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54 45 5f 43  NT_FULL<SQLITE_C
e540: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
e550: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  T );.  assert( S
e560: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e570: 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53 51 4c 49  _PASSIVE+2==SQLI
e580: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
e590: 53 54 41 52 54 20 29 3b 0a 20 20 69 66 28 20 65  START );.  if( e
e5a0: 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43  Mode<SQLITE_CHEC
e5b0: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c  KPOINT_PASSIVE |
e5c0: 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43  | eMode>SQLITE_C
e5d0: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
e5e0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
e5f0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
e600: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
e610: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e620: 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20  tex);.  if( zDb 
e630: 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20  && zDb[0] ){.   
e640: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
e650: 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
e660: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  );.  }.  if( iDb
e670: 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
e680: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
e690: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
e6a0: 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
e6b0: 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20  ERROR, "unknown 
e6c0: 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
e6d0: 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Db);.  }else{.  
e6e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
e6f0: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62  eckpoint(db, iDb
e700: 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
e710: 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c  pnCkpt);.    sql
e720: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
e730: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
e740: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
e750: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
e760: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e770: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e780: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
e790: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
e7a0: 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49   database zDb. I
e7b0: 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f  f zDb is NULL, o
e7c0: 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  r if the buffer 
e7d0: 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zDb points.** to
e7e0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f   contains a zero
e7f0: 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20  -length string, 
e800: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
e810: 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63  abases are .** c
e820: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a  heckpointed..*/.
e830: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
e840: 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
e850: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
e860: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75  ar *zDb){.  retu
e870: 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
e880: 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
e890: 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45   zDb, SQLITE_CHE
e8a0: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
e8b0: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64   0, 0);.}..#ifnd
e8c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
e8d0: 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63  AL./*.** Run a c
e8e0: 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74  heckpoint on dat
e8f0: 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20  abase iDb. This 
e900: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61  is a no-op if da
e910: 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a  tabase iDb is.**
e920: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f   not currently o
e930: 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  pen in WAL mode.
e940: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
e950: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
e960: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e970: 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
e980: 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ed, this .** fun
e990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
e9a0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  LITE_LOCKED and 
e9b0: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  a checkpoint is 
e9c0: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49  not attempted. I
e9d0: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  f .** an error o
e9e0: 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e  ccurs while runn
e9f0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ing the checkpoi
ea00: 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  nt, an SQLite er
ea10: 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
ea20: 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53  returned (i.e. S
ea30: 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74  QLITE_IOERR). Ot
ea40: 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
ea50: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  OK..**.** The mu
ea60: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
ea70: 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64  handle db should
ea80: 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20   be held by the 
ea90: 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65  caller. The mute
eaa0: 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  x.** associated 
eab0: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
eac0: 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63  c b-tree being c
ead0: 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74  heckpointed is t
eae0: 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20  aken by.** this 
eaf0: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74  function while t
eb00: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73  he checkpoint is
eb10: 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   running..**.** 
eb20: 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64  If iDb is passed
eb30: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
eb40: 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61  CHED, then all a
eb50: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
eb60: 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f  s are.** checkpo
eb70: 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72  inted. If an err
eb80: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
eb90: 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  d it is returned
eba0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a   immediately -.*
ebb0: 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  * no attempt is 
ebc0: 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69  made to checkpoi
ebd0: 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67  nt any remaining
ebe0: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
ebf0: 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  * Parameter eMod
ec00: 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  e is one of SQLI
ec10: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
ec20: 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52  SSIVE, FULL or R
ec30: 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73  ESTART..*/.int s
ec40: 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
ec50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
ec60: 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65  t iDb, int eMode
ec70: 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e  , int *pnLog, in
ec80: 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e  t *pnCkpt){.  in
ec90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
eca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
ecb0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ecc0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
ecf0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
ed00: 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69  ached dbs */.  i
ed10: 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20  nt bBusy = 0;   
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ed30: 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45  * True if SQLITE
ed40: 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65  _BUSY has been e
ed50: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20  ncountered */.. 
ed60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ed70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
ed80: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
ed90: 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70  rt( !pnLog || *p
eda0: 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73  nLog==-1 );.  as
edb0: 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c  sert( !pnCkpt ||
edc0: 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a   *pnCkpt==-1 );.
edd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
ede0: 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
edf0: 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
ee00: 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
ee10: 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
ee20: 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
ee30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
ee40: 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
ee50: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d  ->aDb[i].pBt, eM
ee60: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
ee70: 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67  pt);.      pnLog
ee80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b   = 0;.      pnCk
ee90: 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  pt = 0;.      if
eea0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
eeb0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75  Y ){.        bBu
eec0: 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
eed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
eee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eef0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
ef00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42  =SQLITE_OK && bB
ef10: 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55  usy) ? SQLITE_BU
ef20: 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  SY : rc;.}.#endi
ef30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ef40: 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  _WAL */../*.** T
ef50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
ef60: 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69  urns true if mai
ef70: 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20  n-memory should 
ef80: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
ef90: 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
efa0: 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73  y file for trans
efb0: 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73  ient pager files
efc0: 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a   and statement j
efd0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20  ournals..** The 
efe0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64  value returned d
eff0: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
f000: 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f  lue of db->temp_
f010: 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a  store (runtime.*
f020: 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64  * parameter) and
f030: 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d   the compile tim
f040: 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
f050: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68  E_TEMP_STORE. Th
f060: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  e.** following t
f070: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
f080: 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
f090: 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77  between these tw
f0a0: 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20  o values.** and 
f0b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  this functions r
f0c0: 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  eturn value..**.
f0d0: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50  **   SQLITE_TEMP
f0e0: 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
f0f0: 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
f100: 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
f110: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
f120: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
f130: 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
f140: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
f190: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
f1a0: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
f1b0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
f1c0: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
f1d0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
f1e0: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
f1f0: 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
f200: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
f220: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
f230: 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  1).**   1       
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
f270: 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
f2a0: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
f2b0: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
f2e0: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
f2f0: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
f300: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
f310: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
f320: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
f330: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
f340: 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
f350: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
f370: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
f380: 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
f390: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e  TempInMemory(con
f3a0: 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  st sqlite3 *db){
f3b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
f3c0: 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75  _STORE==1.  retu
f3d0: 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
f3e0: 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ore==2 );.#endif
f3f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
f400: 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75  _STORE==2.  retu
f410: 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
f420: 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66  ore!=1 );.#endif
f430: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
f440: 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75  _STORE==3.  retu
f450: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66  rn 1;.#endif.#if
f460: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
f470: 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54  RE<1 || SQLITE_T
f480: 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65  EMP_STORE>3.  re
f490: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
f4a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  ../*.** Return U
f4b0: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67  TF-8 encoded Eng
f4c0: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
f4d0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
f4e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
f4f0: 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
f500: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
f510: 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  rmsg(sqlite3 *db
f520: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
f530: 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
f540: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
f550: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
f560: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69  _NOMEM);.  }.  i
f570: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f580: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
f590: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
f5a0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
f5b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f5c0: 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  T);.  }.  sqlite
f5d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f5e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
f5f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f600: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69   ){.    z = sqli
f610: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
f620: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65  _NOMEM);.  }else
f630: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
f640: 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20  db->pErr==0 );. 
f650: 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71     z = (char*)sq
f660: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
f670: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
f680: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
f690: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
f6a0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
f6b0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
f6c0: 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
f6d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
f6e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f6f0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f700: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
f710: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f720: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
f730: 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f  turn UTF-16 enco
f740: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
f750: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
f760: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
f770: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
f780: 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
f790: 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71  ite3_errmsg16(sq
f7a0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74  lite3 *db){.  st
f7b0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f  atic const u16 o
f7c0: 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20  utOfMem[] = {.  
f7d0: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
f7e0: 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20   ' ', 'o', 'f', 
f7f0: 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27  ' ', 'm', 'e', '
f800: 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79  m', 'o', 'r', 'y
f810: 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ', 0.  };.  stat
f820: 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73  ic const u16 mis
f830: 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c  use[] = {.    'l
f840: 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27  ', 'i', 'b', 'r'
f850: 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'a', 'r', 'y',
f860: 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20   ' ', .    'r', 
f870: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
f880: 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20  i', 'n', 'e', ' 
f890: 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27  ', .    'c', 'a'
f8a0: 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c  , 'l', 'l', 'e',
f8b0: 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'd', ' ', .    
f8c0: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
f8d0: 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66   ', .    'o', 'f
f8e0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27  ', ' ', .    's'
f8f0: 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c  , 'e', 'q', 'u',
f900: 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20   'e', 'n', 'c', 
f910: 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63  'e', 0.  };..  c
f920: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20  onst void *z;.  
f930: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
f940: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75  eturn (void *)ou
f950: 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  tOfMem;.  }.  if
f960: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f970: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
f980: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f990: 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a  (void *)misuse;.
f9a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
f9b0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f9c0: 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
f9d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f9e0: 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29      z = (void *)
f9f0: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73  outOfMem;.  }els
fa00: 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
fa10: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
fa20: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69  db->pErr);.    i
fa30: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
fa40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
fa50: 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72  hMsg(db, db->err
fa60: 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Code, sqlite3Err
fa70: 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
fa80: 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  );.      z = sql
fa90: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
faa0: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
fab0: 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c   }.    /* A mall
fac0: 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61  oc() may have fa
fad0: 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  iled within the 
fae0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
faf0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20  value_text16(). 
fb00: 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20     ** above. If 
fb10: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
fb20: 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
fb30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
fb40: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
fb50: 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
fb60: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f  re returning. Do
fb70: 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20   this directly, 
fb80: 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20  instead of via. 
fb90: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69     ** sqlite3Api
fba0: 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
fbb0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
fbc0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
fbd0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20  or message..    
fbe0: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
fbf0: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d  cFailed = 0;.  }
fc00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fc10: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
fc20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
fc30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
fc40: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
fc50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
fc60: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
fc70: 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ror code generat
fc80: 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20  ed by an SQLite 
fc90: 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c  routine. If NULL
fca0: 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f   is.** passed to
fcb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
fcc0: 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c  we assume a mall
fcd0: 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69  oc() failed duri
fce0: 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ng sqlite3_open(
fcf0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
fd00: 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  3_errcode(sqlite
fd10: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
fd20: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
fd30: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
fd40: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
fd50: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
fd60: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
fd70: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
fd80: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
fd90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
fda0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
fdb0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64   db->errCode & d
fdc0: 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e  b->errMask;.}.in
fdd0: 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
fde0: 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  ed_errcode(sqlit
fdf0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
fe00: 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
fe10: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
fe20: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
fe30: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
fe40: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
fe50: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
fe60: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
fe70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
fe80: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
fe90: 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  n db->errCode;.}
fea0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
feb0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
fec0: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
fed0: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
fee0: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
fef0: 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c  ument.  For now,
ff00: 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c   this simply cal
ff10: 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ls the internal 
ff20: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a  sqlite3ErrStr().
ff30: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
ff40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
ff50: 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72  te3_errstr(int r
ff60: 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  c){.  return sql
ff70: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a  ite3ErrStr(rc);.
ff80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  }../*.** Invalid
ff90: 61 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20 4b  ate all cached K
ffa0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 66  eyInfo objects f
ffb0: 6f 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  or database conn
ffc0: 65 63 74 69 6f 6e 20 22 64 62 22 0a 2a 2f 0a 73  ection "db".*/.s
ffd0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
ffe0: 69 64 61 74 65 43 61 63 68 65 64 4b 65 79 49 6e  idateCachedKeyIn
fff0: 66 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  fo(sqlite3 *db){
10000 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10020 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
10030 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
10040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10050 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
10060 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
10070 72 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  r */.  HashElem 
10080 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
10090 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
100a0 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
100b0 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
100c0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
100d0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
100e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
100f0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
10100 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
10110 20 20 2f 2a 20 45 61 63 68 20 69 6e 64 65 78 20    /* Each index 
10120 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c  */..  for(iDb=0,
10130 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
10140 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
10150 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66  , pDb++){.    if
10160 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 20  ( pDb->pBt==0 ) 
10170 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
10180 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10190 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 66  pDb->pBt);.    f
101a0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
101b0 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
101c0 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
101d0 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
101e0 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
101f0 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
10200 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
10210 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
10220 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
10230 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
10240 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
10250 28 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f  ( pIdx->pKeyInfo
10260 20 26 26 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e   && pIdx->pKeyIn
10270 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 7b 0a 20 20  fo->db==db ){.  
10280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
10290 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 49 64 78  eyInfoUnref(pIdx
102a0 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  ->pKeyInfo);.   
102b0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b 65         pIdx->pKe
102c0 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20  yInfo = 0;.     
102d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
102e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
102f0 72 65 65 4c 65 61 76 65 28 70 44 62 2d 3e 70 42  reeLeave(pDb->pB
10300 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
10310 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f   Create a new co
10320 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
10330 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64   for database "d
10340 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73  b".  The name is
10350 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68   zName.** and th
10360 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e  e encoding is en
10370 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
10380 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
10390 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
103a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
103b0 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c  Name, .  u8 enc,
103c0 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
103d0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
103e0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
103f0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
10400 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
10410 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
10420 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
10430 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20  ;.  int enc2;.  
10440 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10450 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
10460 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
10470 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
10480 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
10490 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
104a0 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
104b0 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
104c0 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
104d0 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
104e0 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
104f0 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
10500 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
10510 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
10520 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
10530 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20  ..  */.  enc2 = 
10540 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28  enc;.  testcase(
10550 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
10560 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  F16 );.  testcas
10570 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
10580 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b  UTF16_ALIGNED );
10590 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c  .  if( enc2==SQL
105a0 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63  ITE_UTF16 || enc
105b0 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
105c0 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65  ALIGNED ){.    e
105d0 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  nc2 = SQLITE_UTF
105e0 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20  16NATIVE;.  }.  
105f0 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f  if( enc2<SQLITE_
10600 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c  UTF8 || enc2>SQL
10610 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20  ITE_UTF16BE ){. 
10620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10630 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
10640 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
10650 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65   this call is re
10660 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63  moving or replac
10670 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ing an existing 
10680 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20  collation .  ** 
10690 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c  sequence. If so,
106a0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
106b0 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72  ctive VMs, retur
106c0 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65  n busy. If there
106d0 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  .  ** are no act
106e0 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64  ive VMs, invalid
106f0 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70  ate any pre-comp
10700 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
10710 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  */.  pColl = 
10720 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
10730 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
10740 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66   zName, 0);.  if
10750 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c  ( pColl && pColl
10760 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66  ->xCmp ){.    if
10770 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
10780 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
10790 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
107a0 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
107b0 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
107c0 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
107d0 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
107e0 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69  ence due to acti
107f0 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
10800 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10810 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
10820 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
10830 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
10840 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69 6e  ents(db);.    in
10850 76 61 6c 69 64 61 74 65 43 61 63 68 65 64 4b 65  validateCachedKe
10860 79 49 6e 66 6f 28 64 62 29 3b 0a 0a 20 20 20 20  yInfo(db);..    
10870 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* If collation 
10880 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77  sequence pColl w
10890 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63  as created direc
108a0 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  tly by a call to
108b0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
108c0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
108d0 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61  , and not genera
108e0 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ted by synthColl
108f0 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68  Seq(),.    ** th
10900 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61  en any copies ma
10910 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  de by synthCollS
10920 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20  eq() need to be 
10930 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20  invalidated..   
10940 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74   ** Also, collat
10950 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d  ion destructor -
10960 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20   CollSeq.xDel() 
10970 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e  - function may n
10980 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
10990 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20   called..    */ 
109a0 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d  .    if( (pColl-
109b0 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55  >enc & ~SQLITE_U
109c0 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65  TF16_ALIGNED)==e
109d0 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  nc2 ){.      Col
109e0 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71  lSeq *aColl = sq
109f0 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
10a00 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
10a10 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  me);.      int j
10a20 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
10a30 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
10a40 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
10a50 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   &aColl[j];.    
10a60 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d      if( p->enc==
10a70 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
10a80 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
10a90 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Del ){.         
10aa0 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55     p->xDel(p->pU
10ab0 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ser);.          
10ac0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78  }.          p->x
10ad0 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cmp = 0;.       
10ae0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10af0 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  }..  pColl = 
10b00 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
10b10 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
10b20 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   zName, 1);.  if
10b30 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
10b40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10b50 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
10b60 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
10b70 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
10b80 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
10b90 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
10ba0 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
10bb0 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
10bc0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
10bd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
10be0 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
10bf0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10c00 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
10c10 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
10c20 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
10c30 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
10c40 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
10c50 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
10c60 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
10c70 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
10c80 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
10c90 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
10ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
10cb0 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
10cc0 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
10cd0 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
10ce0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10cf0 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
10d00 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
10d10 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
10d20 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
10d30 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
10d40 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
10d50 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
10d60 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
10d70 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
10d80 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
10d90 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
10da0 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
10db0 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
10dc0 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20  NUMBER,      /* 
10dd0 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33  IMP: R-38091-323
10de0 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d  52 */.  SQLITE_M
10df0 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
10e00 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ,.  SQLITE_MAX_W
10e10 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d  ORKER_THREADS,.}
10e20 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
10e30 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
10e40 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
10e50 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
10e60 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
10e70 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
10e80 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10e90 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
10ea0 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
10eb0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
10ec0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
10ed0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10ee0 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
10ef0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
10f00 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
10f10 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
10f20 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
10f30 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
10f40 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
10f50 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
10f60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
10f70 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
10f80 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
10f90 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
10fa0 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
10fb0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
10fc0 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
10fd0 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
10fe0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10ff0 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
11000 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
11010 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
11020 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#e
11030 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
11040 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
11050 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
11060 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30  _FUNCTION_ARG>10
11070 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
11080 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
11090 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
110a0 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65  en 0 and 1000.#e
110b0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
110c0 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c  MAX_ATTACHED<0 |
110d0 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  | SQLITE_MAX_ATT
110e0 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f  ACHED>125.# erro
110f0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  r SQLITE_MAX_ATT
11100 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65  ACHED must be be
11110 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a  tween 0 and 125.
11120 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
11130 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
11140 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
11150 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
11160 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
11170 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
11180 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
11190 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
111a0 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
111b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
111c0 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
111d0 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
111e0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
111f0 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
11200 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
11210 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
11220 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
11230 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
11240 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
11250 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c  THREADS<0 || SQL
11260 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
11270 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f  HREADS>50.# erro
11280 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  r SQLITE_MAX_WOR
11290 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74  KER_THREADS must
112a0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
112b0 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  d 50.#endif.../*
112c0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
112d0 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e  alue of a limit.
112e0 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64    Report the old
112f0 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e   value..** If an
11300 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69   invalid limit i
11310 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64  ndex is supplied
11320 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20  , report -1..** 
11330 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
11340 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74  but still report
11350 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69   the old value i
11360 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d  f the.** new lim
11370 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
11380 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65  **.** A new lowe
11390 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74  r limit does not
113a0 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67   shrink existing
113b0 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20   constructs..** 
113c0 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e  It merely preven
113d0 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74  ts new construct
113e0 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68  s that exceed th
113f0 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20  e limit.** from 
11400 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  forming..*/.int 
11410 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71  sqlite3_limit(sq
11420 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c  lite3 *db, int l
11430 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c  imitId, int newL
11440 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64  imit){.  int old
11450 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56  Limit;...  /* EV
11460 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
11470 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
11480 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
11490 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
114a0 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
114b0 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
114c0 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
114d0 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
114e0 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
114f0 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
11500 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
11510 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
11520 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
11530 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
11540 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
11550 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
11560 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
11570 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
11580 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
11590 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
115a0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
115b0 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
115c0 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
115d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
115e0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
115f0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
11600 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
11610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
11620 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
11630 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
11640 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
11650 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
11660 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
11670 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
11680 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
11690 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
116a0 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
116b0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
116c0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
116d0 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
116e0 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
116f0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
11700 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
11710 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
11720 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
11730 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
11740 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11750 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
11760 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
11770 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
11780 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
11790 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
117a0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
117b0 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
117f0 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
11800 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
11810 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
11820 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
11830 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
11840 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
11850 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
11860 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
11870 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
11880 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
11890 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
118a0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
118b0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
118c0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
118d0 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54  _THREADS]==SQLIT
118e0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
118f0 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74  EADS );.  assert
11900 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  ( SQLITE_LIMIT_W
11910 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28  ORKER_THREADS==(
11920 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31  SQLITE_N_LIMIT-1
11930 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d  ) );...  if( lim
11940 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49  itId<0 || limitI
11950 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  d>=SQLITE_N_LIMI
11960 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
11970 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d  -1;.  }.  oldLim
11980 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  it = db->aLimit[
11990 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20  limitId];.  if( 
119a0 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20  newLimit>=0 ){  
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36   /* IMP: R-52476
119d0 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66  -28732 */.    if
119e0 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
119f0 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
11a00 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
11a10 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
11a20 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a  mitId];  /* IMP:
11a30 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a   R-51463-25634 *
11a40 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  /.    }.    db->
11a50 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
11a60 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
11a70 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
11a80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
11a90 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
11aa0 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a  -53341-35419 */.
11ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11ac0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
11ad0 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49  o parse both URI
11ae0 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69  s and non-URI fi
11af0 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62  lenames passed b
11b00 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f  y the.** user to
11b10 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73   API functions s
11b20 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72  qlite3_open() or
11b30 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
11b40 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61  (), and for data
11b50 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65  base.** URIs spe
11b60 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f  cified as part o
11b70 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65  f ATTACH stateme
11b80 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nts..**.** The f
11b90 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
11ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11bb0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
11bc0 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72  e VFS to use (or
11bd0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69  .** a NULL to si
11be0 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c  gnify the defaul
11bf0 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52  t VFS) if the UR
11c00 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  I does not conta
11c10 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a  in a "vfs=xxx".*
11c20 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
11c30 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  r. The second ar
11c40 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  gument contains 
11c50 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d  the URI (or non-
11c60 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a  URI filename).**
11c70 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68   itself. When th
11c80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11c90 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67  alled the *pFlag
11ca0 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c  s variable shoul
11cb0 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65  d contain.** the
11cc0 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74   default flags t
11cd0 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
11ce0 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e  ase handle with.
11cf0 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
11d00 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20  d in.** *pFlags 
11d10 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62  may be updated b
11d20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
11d30 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e  if the URI filen
11d40 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  ame contains .**
11d50 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20   "cache=xxx" or 
11d60 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79  "mode=xxx" query
11d70 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a   parameters..**.
11d80 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
11d90 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
11da0 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
11db0 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20   case *ppVfs is 
11dc0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
11dd0 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20  ** the VFS that 
11de0 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74  should be used t
11df0 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
11e00 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c  ase file. *pzFil
11e10 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70  e is set to.** p
11e20 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
11e30 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
11e40 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
11e50 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20   to open. It is 
11e60 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
11e70 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
11e80 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
11e90 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ly call sqlite3_
11ea0 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73  free() to releas
11eb0 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
11ec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
11ed0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
11ee0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
11ef0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
11f00 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a  d and *pzErrMsg.
11f10 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  ** may be set to
11f20 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
11f30 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
11f40 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
11f50 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  e error .** mess
11f60 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
11f70 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
11f80 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
11f90 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
11fa0 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
11fb0 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
11fc0 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69  te3_free()..*/.i
11fd0 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  nt sqlite3ParseU
11fe0 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ri(.  const char
11ff0 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20   *zDefaultVfs,  
12000 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
12010 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78  use if no "vfs=x
12020 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e  xx" query option
12030 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
12040 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20   *zUri,         
12050 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
12060 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70  minated URI to p
12070 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  arse */.  unsign
12080 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20  ed int *pFlags, 
12090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
120a0 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e  OUT: SQLITE_OPEN
120b0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
120c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70  sqlite3_vfs **pp
120d0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
120e0 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75  /* OUT: VFS to u
120f0 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a  se */ .  char **
12100 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  pzFile,         
12110 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
12120 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e   Filename compon
12130 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20  ent of URI */.  
12140 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65  /* OUT: Error me
12170 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51  ssage (if rc!=SQ
12180 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20  LITE_OK) */.){. 
12190 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
121a0 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  _OK;.  unsigned 
121b0 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c  int flags = *pFl
121c0 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ags;.  const cha
121d0 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75  r *zVfs = zDefau
121e0 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a  ltVfs;.  char *z
121f0 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a  File;.  char c;.
12200 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c    int nUri = sql
12210 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72  ite3Strlen30(zUr
12220 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  i);..  assert( *
12230 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a  pzErrMsg==0 );..
12240 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20    if( ((flags & 
12250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
12260 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
12270 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
12280 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  ) .   && nUri>=5
12290 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
122a0 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
122b0 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
122c0 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53  zOpt;.    int eS
122d0 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
122e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
122f0 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61 72  r state when par
12300 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20  sing URI */.    
12310 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20  int iIn;        
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12330 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65 72   Input character
12340 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
12350 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20  t iOut = 0;     
12360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12370 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72 20  utput character 
12380 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
12390 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b   nByte = nUri+2;
123a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
123b0 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
123c0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20  allocate */..   
123d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
123e0 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  e SQLITE_OPEN_UR
123f0 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  I flag is set to
12400 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65   indicate to the
12410 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20   VFS xOpen .    
12420 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74  ** method that t
12430 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74 72  here may be extr
12440 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c  a parameters fol
12450 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d  lowing the file-
12460 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c  name.  */.    fl
12470 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
12480 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72  EN_URI;..    for
12490 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69  (iIn=0; iIn<nUri
124a0 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b  ; iIn++) nByte +
124b0 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26  = (zUri[iIn]=='&
124c0 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  ');.    zFile = 
124d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
124e0 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
124f0 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
12500 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
12510 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 6e 64    iIn = 5;.#ifnd
12520 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f  ef SQLITE_ALLOW_
12530 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20  URI_AUTHORITY.  
12540 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
12550 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68   scheme and auth
12560 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f  ority segments o
12570 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20  f the URI. */.  
12580 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27    if( zUri[5]=='
12590 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27  /' && zUri[6]=='
125a0 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  /' ){.      iIn 
125b0 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 7;.      while
125c0 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
125d0 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20  Uri[iIn]!='/' ) 
125e0 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
125f0 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
12600 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
12610 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
12620 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
12630 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
12640 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12650 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
12660 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
12670 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
12680 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
12690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
126a0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
126b0 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
126c0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
126d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
126e0 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
126f0 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
12700 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
12710 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
12720 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
12730 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
12740 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
12750 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
12760 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
12770 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
12780 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
12790 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
127a0 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
127b0 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
127c0 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
127d0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
127e0 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
127f0 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
12800 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
12810 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
12820 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
12830 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
12840 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
12850 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
12860 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
12870 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
12880 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
12890 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
128a0 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
128b0 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
128c0 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
128d0 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
128e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
128f0 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
12900 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
12910 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
12920 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
12930 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
12940 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
12950 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
12960 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
12970 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
12980 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
12990 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
129a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
129b0 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
129c0 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
129d0 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20  f( octet==0 ){. 
129e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
129f0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
12a00 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65   when "%00" appe
12a10 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55  ars within the U
12a20 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  RI. In this.    
12a30 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65        ** case we
12a40 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74   ignore all text
12a50 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
12a60 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e  r of the path, n
12a70 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20  ame or.         
12a80 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e   ** value curren
12a90 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64  tly being parsed
12aa0 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  . So ignore the 
12ab0 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65  current characte
12ac0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  r.          ** a
12ad0 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e  nd skip to the n
12ae0 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20  ext "?", "=" or 
12af0 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  "&", as appropri
12b00 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
12b10 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
12b20 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
12b30 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20  !='#' .         
12b40 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
12b50 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20  =0 || c!='?').  
12b60 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
12b70 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21  eState!=1 || (c!
12b80 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29  ='=' && c!='&'))
12b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
12ba0 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20  & (eState!=2 || 
12bb0 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20  c!='&').        
12bc0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
12bd0 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
12be0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
12bf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12c00 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63  }.        c = oc
12c10 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tet;.      }else
12c20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26   if( eState==1 &
12c30 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d  & (c=='&' || c==
12c40 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
12c50 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31  if( zFile[iOut-1
12c60 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
12c70 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70    /* An empty op
12c80 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72  tion name. Ignor
12c90 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c  e this option al
12ca0 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20  together. */.   
12cb0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55         while( zU
12cc0 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
12cd0 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72  iIn]!='#' && zUr
12ce0 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20  i[iIn-1]!='&' ) 
12cf0 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
12d00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12d20 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20   c=='&' ){.     
12d30 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
12d40 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  +] = '\0';.     
12d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12d60 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a      eState = 2;.
12d70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12d80 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    c = 0;.      }
12d90 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65  else if( (eState
12da0 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c  ==0 && c=='?') |
12db0 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20  | (eState==2 && 
12dc0 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20  c=='&') ){.     
12dd0 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
12de0 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20    eState = 1;.  
12df0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c      }.      zFil
12e00 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20  e[iOut++] = c;. 
12e10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74     }.    if( eSt
12e20 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69  ate==1 ) zFile[i
12e30 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
12e40 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
12e50 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
12e60 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
12e70 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ';..    /* Check
12e80 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61   if there were a
12e90 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69  ny options speci
12ea0 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64  fied that should
12eb0 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
12ec0 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70  .    ** here. Op
12ed0 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69  tions that are i
12ee0 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20  nterpreted here 
12ef0 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e  include "vfs" an
12f00 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20  d those that.   
12f10 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74   ** correspond t
12f20 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79  o flags that may
12f30 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
12f40 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  e sqlite3_open_v
12f50 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  2().    ** metho
12f60 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d  d. */.    zOpt =
12f70 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53   &zFile[sqlite3S
12f80 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
12f90 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f  ];.    while( zO
12fa0 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  pt[0] ){.      i
12fb0 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65  nt nOpt = sqlite
12fc0 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b  3Strlen30(zOpt);
12fd0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61  .      char *zVa
12fe0 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31  l = &zOpt[nOpt+1
12ff0 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  ];.      int nVa
13000 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
13010 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20  n30(zVal);..    
13020 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26    if( nOpt==3 &&
13030 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a   memcmp("vfs", z
13040 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 3)==0 ){.  
13050 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61        zVfs = zVa
13060 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  l;.      }else{.
13070 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f          struct O
13080 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20  penMode {.      
13090 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
130a0 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  z;.          int
130b0 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
130c0 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20   *aMode = 0;.   
130d0 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65       char *zMode
130e0 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Type = 0;.      
130f0 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
13100 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69          int limi
13110 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  t = 0;..        
13120 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d  if( nOpt==5 && m
13130 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a  emcmp("cache", z
13140 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 5)==0 ){.  
13150 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
13160 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
13170 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  CacheMode[] = {.
13180 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73              { "s
13190 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f  hared",  SQLITE_
131a0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
131b0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
131c0 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c  { "private", SQL
131d0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
131e0 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20  CACHE },.       
131f0 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
13200 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
13210 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
13220 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
13230 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ACHE|SQLITE_OPEN
13240 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20  _PRIVATECACHE;. 
13250 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
13260 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20   aCacheMode;.   
13270 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
13280 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ask;.          z
13290 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68  ModeType = "cach
132a0 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e";.        }.  
132b0 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
132c0 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64  4 && memcmp("mod
132d0 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20  e", zOpt, 4)==0 
132e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
132f0 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d  tic struct OpenM
13300 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20  ode aOpenMode[] 
13310 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
13320 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f  { "ro",  SQLITE_
13330 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
13340 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
13350 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  rw",  SQLITE_OPE
13360 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a  N_READWRITE }, .
13370 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
13380 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  wc", SQLITE_OPEN
13390 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
133a0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
133b0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
133c0 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54   "memory", SQLIT
133d0 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c  E_OPEN_MEMORY },
133e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
133f0 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
13400 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
13410 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
13420 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49  _READONLY | SQLI
13430 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13440 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
13450 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
13460 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
13470 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a  TE_OPEN_MEMORY;.
13480 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
13490 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20  = aOpenMode;.   
134a0 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
134b0 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20  ask & flags;.   
134c0 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
134d0 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20   = "access";.   
134e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
134f0 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20  if( aMode ){.   
13500 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
13510 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
13520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13530 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69  for(i=0; aMode[i
13540 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ].z; i++){.     
13550 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
13560 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  r *z = aMode[i].
13570 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  z;.            i
13580 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33  f( nVal==sqlite3
13590 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30  Strlen30(z) && 0
135a0 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a  ==memcmp(zVal, z
135b0 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  , nVal) ){.     
135c0 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20           mode = 
135d0 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20  aMode[i].mode;. 
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
135f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
13600 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
13610 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65          if( mode
13620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13630 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
13640 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13650 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a  no such %s mode:
13660 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c   %s", zModeType,
13670 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
13680 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13690 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
136a0 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
136b0 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
136c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
136d0 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45   (mode & ~SQLITE
136e0 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69  _OPEN_MEMORY)>li
136f0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
13700 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
13710 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13720 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f  %s mode not allo
13730 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  wed: %s",.      
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61    zModeType, zVa
13770 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
13780 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d  rc = SQLITE_PERM
13790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
137a0 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
137b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
137c0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
137d0 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20  (flags & ~mask) 
137e0 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  | mode;.        
137f0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
13800 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56   zOpt = &zVal[nV
13810 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  al+1];.    }..  
13820 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65  }else{.    zFile
13830 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
13840 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69  c(nUri+2);.    i
13850 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
13860 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13870 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c  .    memcpy(zFil
13880 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  e, zUri, nUri);.
13890 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20      zFile[nUri] 
138a0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
138b0 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27  e[nUri+1] = '\0'
138c0 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  ;.    flags &= ~
138d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
138e0 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d  .  }..  *ppVfs =
138f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
13900 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a  d(zVfs);.  if( *
13910 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ppVfs==0 ){.    
13920 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
13930 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
13940 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a  such vfs: %s", z
13950 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  Vfs);.    rc = S
13960 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
13970 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a  . parse_uri_out:
13980 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
139a0 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b  te3_free(zFile);
139b0 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a  .    zFile = 0;.
139c0 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20    }.  *pFlags = 
139d0 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65  flags;.  *pzFile
139e0 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75   = zFile;.  retu
139f0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
13a00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
13a10 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f  es the work of o
13a20 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73  pening a databas
13a30 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a  e on behalf of.*
13a40 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
13a50 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65   and sqlite3_ope
13a60 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62  n16(). The datab
13a70 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46  ase filename "zF
13a80 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73  ilename"  .** is
13a90 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a   UTF-8 encoded..
13aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
13ab0 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f  enDatabase(.  co
13ac0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
13ad0 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65  ame, /* Database
13ae0 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20   filename UTF-8 
13af0 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c  encoded */.  sql
13b00 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
13b10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
13b20 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61  rned database ha
13b30 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ndle */.  unsign
13b40 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  ed int flags,   
13b50 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20   /* Operational 
13b60 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
13b70 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
13b80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
13b90 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29   VFS to use */.)
13ba0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c      /* Store all
13bd0 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65  ocated handle he
13be0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  re */.  int rc; 
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
13c10 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
13c20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20  isThreadsafe;   
13c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13c40 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61  rue for threadsa
13c50 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  fe connections *
13c60 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20  /.  char *zOpen 
13c70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13c80 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
13c90 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  argument to pass
13ca0 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20   to BtreeOpen() 
13cb0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
13cc0 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sg = 0;         
13cd0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
13ce0 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74  ssage from sqlit
13cf0 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a  e3ParseUri() */.
13d00 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
13d10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13d20 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
13d30 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
13d40 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
13d50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
13d60 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
13d70 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
13d80 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
13d90 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
13da0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
13db0 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
13dc0 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
13dd0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
13de0 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
13df0 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
13e00 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
13e10 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
13e20 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
13e30 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
13e40 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
13e50 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
13e60 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
13e70 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
13e80 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
13e90 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
13ea0 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
13eb0 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
13ec0 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
13ed0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
13ee0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13ef0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13f00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13f10 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
13f20 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
13f30 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
13f40 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
13f50 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
13f60 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
13f70 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
13f80 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
13f90 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
13fa0 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
13fb0 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
13fc0 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
13fd0 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
13fe0 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
13ff0 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
14000 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
14010 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
14020 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
14030 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65   & 0x46)==0 ) re
14040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
14050 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20  SE_BKPT;..  if( 
14060 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14070 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
14080 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
14090 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
140a0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
140b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
140c0 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
140d0 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
140e0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
140f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
14100 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
14110 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
14120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
14130 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
14140 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
14150 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20  FullMutex;.  }. 
14160 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
14170 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
14180 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
14190 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
141a0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
141b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
141c0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
141d0 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
141e0 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
141f0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
14200 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
14210 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
14220 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
14230 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
14240 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
14250 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
14260 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
14270 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
14280 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
14290 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
142a0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
142b0 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
142c0 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
142d0 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
142e0 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
142f0 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
14300 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
14310 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
14320 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
14330 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
14340 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
14350 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
14360 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
14370 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
14380 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
14390 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
143a0 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
143b0 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
143c0 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
143d0 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
143e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14400 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
14410 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
14420 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
14430 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
14440 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14450 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
14460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
14480 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
14490 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
144a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
144b0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
144c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
144d0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
144e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
144f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
14500 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
14510 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14520 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
14530 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
14540 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14550 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
14560 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
14570 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
14580 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
14590 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
145a0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
145b0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
145c0 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
145d0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
145e0 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
145f0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
14600 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
14610 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
14620 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
14630 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a  isThreadsafe ){.
14640 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
14650 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
14660 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
14670 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
14680 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
14690 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
146a0 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
146b0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
146c0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
146d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
146e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
146f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
14700 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
14710 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
14720 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
14730 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
14740 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
14750 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20  ->aDbStatic;..  
14760 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
14770 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
14780 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
14790 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
147a0 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
147b0 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
147c0 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c  imit));.  db->aL
147d0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
147e0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
147f0 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ] = SQLITE_DEFAU
14800 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  LT_WORKER_THREAD
14810 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  S;.  db->autoCom
14820 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e  mit = 1;.  db->n
14830 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b  extAutovac = -1;
14840 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20  .  db->szMmap = 
14850 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14860 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62  fig.szMmap;.  db
14870 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
14880 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f   0;.  db->nMaxSo
14890 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46  rterMmap = 0x7FF
148a0 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61  FFFFF;.  db->fla
148b0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
148c0 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c  rtColNames | SQL
148d0 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
148e0 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65  r | SQLITE_Cache
148f0 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e  Spill.#if !defin
14900 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
14910 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
14920 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46  X) || SQLITE_DEF
14930 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
14940 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20  NDEX.           
14950 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
14960 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a  utoIndex.#endif.
14970 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
14980 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34  LT_FILE_FORMAT<4
14990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
149a0 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63    | SQLITE_Legac
149b0 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a  yFileFmt.#endif.
149c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
149d0 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
149e0 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
149f0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f       | SQLITE_Lo
14a00 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64  adExtension.#end
14a10 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
14a20 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f  FAULT_RECURSIVE_
14a30 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20  TRIGGERS.       
14a40 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
14a50 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23  TE_RecTriggers.#
14a60 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
14a70 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
14a80 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26  _FOREIGN_KEYS) &
14a90 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  & SQLITE_DEFAULT
14aa0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20  _FOREIGN_KEYS.  
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14ac0 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b   SQLITE_ForeignK
14ad0 65 79 73 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  eys.#endif.     
14ae0 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   ;.  sqlite3Hash
14af0 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Init(&db->aCollS
14b00 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eq);.#ifndef SQL
14b10 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14b20 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48  TABLE.  sqlite3H
14b30 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f  ashInit(&db->aMo
14b40 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dule);.#endif.. 
14b50 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66 61   /* Add the defa
14b60 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
14b70 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42  quence BINARY. B
14b80 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20  INARY works for 
14b90 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20  both UTF-8.  ** 
14ba0 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61  and UTF-16, so a
14bb0 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72  dd a version for
14bc0 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61   each to avoid a
14bd0 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20  ny unnecessary. 
14be0 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e   ** conversions.
14bf0 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20   The only error 
14c00 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68  that can occur h
14c10 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28  ere is a malloc(
14c20 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a  ) failure..  */.
14c30 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
14c40 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
14c50 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
14c60 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
14c70 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
14c80 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
14c90 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
14ca0 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
14cb0 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
14cc0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
14cd0 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  RY", SQLITE_UTF1
14ce0 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6LE, 0, binCollF
14cf0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
14d00 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
14d10 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55  RTRIM", SQLITE_U
14d20 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62  TF8, (void*)1, b
14d30 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
14d40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
14d50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
14d60 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
14d70 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f   }.  db->pDfltCo
14d80 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
14d90 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
14da0 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59  TE_UTF8, "BINARY
14db0 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  ", 0);.  assert(
14dc0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d   db->pDfltColl!=
14dd0 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  0 );..  /* Also 
14de0 61 64 64 20 61 20 55 54 46 2d 38 20 63 61 73 65  add a UTF-8 case
14df0 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6c  -insensitive col
14e00 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
14e10 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
14e20 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53  ation(db, "NOCAS
14e30 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  E", SQLITE_UTF8,
14e40 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74   0, nocaseCollat
14e50 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20  ingFunc, 0);..  
14e60 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c  /* Parse the fil
14e70 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65  ename/URI argume
14e80 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65  nt. */.  db->ope
14e90 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  nFlags = flags;.
14ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14eb0 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69  rseUri(zVfs, zFi
14ec0 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20  lename, &flags, 
14ed0 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65  &db->pVfs, &zOpe
14ee0 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n, &zErrMsg);.  
14ef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14f00 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
14f10 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
14f20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14f30 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
14f40 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
14f50 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20  , rc, zErrMsg ? 
14f60 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73  "%s" : 0, zErrMs
14f70 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
14f80 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
14f90 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
14fa0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  ut;.  }..  /* Op
14fb0 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64  en the backend d
14fc0 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a  atabase driver *
14fd0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
14fe0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
14ff0 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26  fs, zOpen, db, &
15000 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
15010 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
15020 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
15030 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
15040 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72  AIN_DB);.  if( r
15050 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15060 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15070 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
15080 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15090 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
150a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
150b0 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67  r(db, rc);.    g
150c0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
150d0 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d    }.  db->aDb[0]
150e0 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
150f0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
15100 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
15110 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
15120 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
15130 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
15140 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
15150 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
15160 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
15170 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b  abase is 'full';
15180 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
15190 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
151a0 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d  s 'NONE'. This m
151b0 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72  atches the pager
151c0 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e   layer defaults.
151d0 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44    .  */.  db->aD
151e0 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61  b[0].zName = "ma
151f0 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
15200 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
15210 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d   3;.  db->aDb[1]
15220 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
15230 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
15240 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a  fety_level = 1;.
15250 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
15260 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
15270 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
15280 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
15290 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
152a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
152b0 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
152c0 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
152d0 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
152e0 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
152f0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
15300 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
15310 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
15320 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
15330 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
15340 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
15350 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
15360 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
15370 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75  qlite3RegisterBu
15380 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64  iltinFunctions(d
15390 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  b);..  /* Load a
153a0 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
153b0 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
153c0 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
153d0 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
153e0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
153f0 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
15400 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
15410 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
15420 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
15430 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15440 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
15450 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  AutoLoadExtensio
15460 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ns(db);.    rc =
15470 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
15480 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
15490 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
154a0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
154b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
154c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
154d0 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28  NABLE_FTS1.  if(
154e0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
154f0 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ed ){.    extern
15500 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31   int sqlite3Fts1
15510 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
15520 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15530 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts1Init(db);.  
15540 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
15550 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
15560 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS2.  if( !db->m
15570 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
15580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15590 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
155a0 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73  qlite3Fts2Init(s
155b0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
155c0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e   = sqlite3Fts2In
155d0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
155e0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
155f0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20  E_ENABLE_FTS3.  
15600 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
15610 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
15620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
15630 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e   = sqlite3Fts3In
15640 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
15650 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
15660 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69  E_ENABLE_ICU.  i
15670 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
15680 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
15690 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
156a0 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
156b0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
156c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
156d0 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69  ENABLE_RTREE.  i
156e0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
156f0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
15700 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
15710 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
15720 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
15730 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45  f..  /* -DSQLITE
15740 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
15750 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58  _MODE=1 makes EX
15760 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61  CLUSIVE the defa
15770 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
15780 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45   mode.  -DSQLITE
15790 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
157a0 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52  _MODE=0 make NOR
157b0 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20  MAL the default 
157c0 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
157d0 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e  e.  Doing nothin
157e0 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61  g at all also ma
157f0 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  kes NORMAL the d
15800 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66  efault..  */.#if
15810 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
15820 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a  LT_LOCKING_MODE.
15830 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
15840 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
15850 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
15860 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
15870 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69  LockingMode(sqli
15880 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
15890 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20  ->aDb[0].pBt),. 
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
158c0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
158d0 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  MODE);.#endif.. 
158e0 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65   if( rc ) sqlite
158f0 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
15900 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65  .  /* Enable the
15910 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f   lookaside-mallo
15920 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20  c subsystem */. 
15930 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
15940 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c  db, 0, sqlite3Gl
15950 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
15960 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20  kaside,.        
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
15990 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b  fig.nLookaside);
159a0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ..  sqlite3_wal_
159b0 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
159c0 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  b, SQLITE_DEFAUL
159d0 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  T_WAL_AUTOCHECKP
159e0 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f  OINT);..opendb_o
159f0 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
15a00 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28  ee(zOpen);.  if(
15a10 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
15a20 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20  t( db->mutex!=0 
15a30 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d  || isThreadsafe=
15a40 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  =0 || sqlite3Glo
15a50 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
15a60 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
15a70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a80 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
15a90 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
15aa0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
15ab0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c   assert( db!=0 |
15ac0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
15ad0 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  EM );.  if( rc==
15ae0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
15af0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
15b00 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
15b10 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
15b20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15b30 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
15b40 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
15b50 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d  K;.  }.  *ppDb =
15b60 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   db;.#ifdef SQLI
15b70 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
15b80 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
15b90 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
15ba0 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  og ){.    /* Ope
15bb0 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65  ning a db handle
15bc0 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
15bd0 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20  er is passed 0. 
15be0 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72  */.    void *pAr
15bf0 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  g = sqlite3Globa
15c00 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
15c10 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  rg;.    sqlite3G
15c20 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
15c30 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46  log(pArg, db, zF
15c40 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ilename, 0);.  }
15c50 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
15c60 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
15c70 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  0, rc);.}../*.**
15c80 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
15c90 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
15ca0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
15cb0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
15cc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
15cd0 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
15ce0 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
15cf0 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
15d00 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
15d20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
15d30 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
15d40 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
15d50 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
15d60 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
15d70 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
15d80 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
15d90 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
15da0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
15db0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15dc0 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
15dd0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
15de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
15df0 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
15e00 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
15e10 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15e20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
15e30 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
15e40 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
15e50 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
15e60 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
15e70 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
15e80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15e90 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
15ea0 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
15eb0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
15ec0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
15ed0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
15ee0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
15ef0 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
15f00 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
15f10 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
15f20 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
15f30 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
15f40 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
15f50 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
15f60 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
15f70 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
15f80 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
15f90 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20  ppDb );.  *ppDb 
15fa0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
15fb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
15fc0 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
15fd0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
15fe0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15ff0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56   rc;.#endif.  pV
16000 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
16010 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
16020 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
16030 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
16040 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
16050 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
16060 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
16070 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
16080 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
16090 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
160a0 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
160b0 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
160c0 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
160d0 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
160f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16100 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
16110 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
16120 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
16130 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
16140 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
16150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
16160 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
16170 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
16180 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
16190 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
161a0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
161b0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
161c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
161d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
161e0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
161f0 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
16200 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
16210 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
16220 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16230 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
16240 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
16250 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16260 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
16270 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
16280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
16290 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
162a0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
162b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
162c0 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
162d0 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
162e0 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
162f0 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
16300 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
16310 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
16320 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
16330 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
16340 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
16350 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
16360 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
16370 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
16380 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
16390 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
163a0 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
163b0 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
163c0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
163d0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
163e0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
163f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  c;.}../*.** Regi
16400 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
16410 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
16420 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
16430 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
16440 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
16450 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
16460 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
16470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
16480 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
16490 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
164a0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
164b0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
164c0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
164d0 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
164e0 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
164f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
16500 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16510 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
16520 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
16530 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
16540 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
16550 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
16560 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
16570 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
16580 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
16590 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
165a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
165b0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
165c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
165d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
165e0 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
165f0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
16600 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
16610 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
16620 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
16630 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
16640 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
16650 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
16660 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
16670 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
16680 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
16690 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
166a0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
166b0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
166c0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
166d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
166e0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
166f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16700 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
16710 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
16720 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
16730 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
16740 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
16750 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
16760 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
16770 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
16780 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
16790 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
167a0 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  me8, (u8)enc, pC
167b0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
167c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
167d0 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b  ree(db, zName8);
167e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
167f0 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
16800 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
16810 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
16820 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
16830 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
16840 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
16850 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
16860 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
16870 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
16880 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
16890 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
168a0 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
168b0 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
168c0 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
168d0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
168e0 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
168f0 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
16900 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65  needed(.  sqlite
16910 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
16920 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
16930 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
16940 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69  eded)(void*,sqli
16950 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
16960 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  p,const char*).)
16970 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
16980 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
16990 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
169a0 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65  eeded = xCollNee
169b0 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ded;.  db->xColl
169c0 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20  Needed16 = 0;.  
169d0 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
169e0 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
169f0 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
16a00 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
16a10 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
16a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
16a30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16a40 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
16a50 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
16a60 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
16a70 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
16a80 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
16a90 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
16aa0 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
16ab0 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
16ac0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
16ad0 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
16ae0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
16af0 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73  on_needed16(.  s
16b00 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
16b10 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
16b20 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
16b30 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69  ollNeeded16)(voi
16b40 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
16b50 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76  eTextRep,const v
16b60 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74  oid*).){.  sqlit
16b70 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
16b80 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
16b90 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30  >xCollNeeded = 0
16ba0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
16bb0 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65  ded16 = xCollNee
16bc0 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f  ded16;.  db->pCo
16bd0 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
16be0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
16bf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
16c00 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
16c10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16c20 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
16c30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
16c40 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
16c50 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
16c60 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
16c70 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
16c80 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20  an anachronism. 
16c90 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73  It used to be us
16ca0 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ed to recover fr
16cb0 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  om a.** malloc()
16cc0 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51   failure, but SQ
16cd0 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68  Lite now does th
16ce0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
16cf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16d00 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
16d10 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
16d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16d30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
16d40 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
16d50 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  r not the databa
16d60 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
16d70 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a   in autocommit.*
16d80 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  * mode.  Return 
16d90 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e  TRUE if it is an
16da0 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20  d FALSE if not. 
16db0 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   Autocommit mode
16dc0 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66   is on.** by def
16dd0 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69  ault.  Autocommi
16de0 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79  t is disabled by
16df0 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
16e00 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64  nt and reenabled
16e10 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20  .** by the next 
16e20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
16e30 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
16e40 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
16e50 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
16e60 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
16e70 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
16e80 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
16e90 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
16ea0 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e  stitutes for con
16eb0 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f  stants SQLITE_CO
16ec0 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45  RRUPT,.** SQLITE
16ed0 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f  _MISUSE, SQLITE_
16ee0 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45  CANTOPEN, SQLITE
16ef0 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69  _IOERR and possi
16f00 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  bly other error.
16f10 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
16f20 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70 75  hey serve two pu
16f30 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
16f40 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
16f50 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
16f60 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
16f70 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
16f80 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
16f90 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
16fa0 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
16fb0 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
16fc0 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
16fd0 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
16fe0 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
16ff0 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
17000 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
17010 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
17020 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
17030 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17040 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
17050 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
17060 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
17070 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
17080 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
17090 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
170a0 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
170b0 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
170c0 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
170d0 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
170f0 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
17100 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
17110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17120 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
17130 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
17140 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
17150 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
17160 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
17170 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
17180 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
17190 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
171a0 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
171b0 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
171c0 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
171d0 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
171e0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
171f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17200 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
17210 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
17220 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
17230 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
17240 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17250 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
17260 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
17270 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
17280 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
17290 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
172a0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
172b0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
172c0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
172d0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
172e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
172f0 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
17300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17310 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
17320 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
17330 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
17340 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
17350 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
17360 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
17370 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
17380 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
17390 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
173a0 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
173b0 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
173c0 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
173d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
173e0 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
173f0 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
17400 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
17410 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
17420 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
17430 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
17440 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
17450 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
17460 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
17470 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
17480 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
17490 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
174a0 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
174b0 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
174c0 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
174d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
174e0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
174f0 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74  TADATA.int sqlit
17500 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
17510 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
17520 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
17530 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
17540 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
17550 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
17560 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
17570 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
17580 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
17590 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
175a0 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
175b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
175c0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
175d0 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
175e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
175f0 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
17600 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
17610 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
17620 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
17630 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
17640 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
17650 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
17660 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
17670 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
17680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
17690 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
176a0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
176b0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
176c0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
176d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
176e0 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
176f0 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
17700 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17720 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
17730 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
17740 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
17750 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
17760 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
17770 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
17780 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
17790 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
177a0 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  l;..  char const
177b0 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
177c0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
177d0 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
177e0 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
177f0 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
17800 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
17810 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
17820 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
17830 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
17840 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
17850 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17860 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
17870 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17880 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
17890 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
178a0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
178b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
178c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
178d0 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
178e0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
178f0 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
17900 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
17910 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
17920 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
17930 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
17940 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
17950 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
17960 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
17970 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
17980 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
17990 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
179a0 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
179b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
179c0 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
179d0 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
179e0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
179f0 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
17a00 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
17a10 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
17a20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
17a30 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
17a40 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
17a50 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
17a60 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
17a70 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
17a80 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
17a90 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
17aa0 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
17ab0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
17ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17ad0 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
17ae0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
17af0 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
17b00 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
17b10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17b20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17b30 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
17b40 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
17b50 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
17b60 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
17b70 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
17b80 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
17b90 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
17ba0 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
17bb0 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
17bc0 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
17bd0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
17be0 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
17bf0 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
17c00 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
17c10 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
17c20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
17c30 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
17c40 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
17c50 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
17c60 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
17c70 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
17c80 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
17c90 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
17ca0 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
17cb0 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
17cc0 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
17cd0 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
17ce0 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
17cf0 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
17d00 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
17d10 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
17d20 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
17d30 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
17d40 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
17d50 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
17d60 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
17d70 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
17d80 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
17d90 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  = (pCol->colFlag
17da0 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
17db0 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74  KEY)!=0;.    aut
17dc0 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
17dd0 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
17de0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
17df0 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
17e00 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
17e10 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
17e20 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
17e30 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
17e40 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
17e50 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
17e60 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
17e70 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
17e80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
17e90 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
17ea0 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
17eb0 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
17ec0 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
17ed0 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
17ee0 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
17ef0 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
17f00 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
17f10 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
17f20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
17f30 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
17f40 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
17f50 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
17f60 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
17f70 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
17f80 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
17f90 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
17fa0 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
17fb0 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
17fc0 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
17fd0 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
17fe0 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
17ff0 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
18000 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
18010 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
18020 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
18030 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
18040 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
18050 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
18060 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
18070 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
18080 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
18090 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
180a0 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
180b0 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
180c0 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
180d0 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
180e0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
180f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
18100 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
18110 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45  hMsg(db, rc, (zE
18120 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
18130 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
18140 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
18150 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
18160 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
18170 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
18180 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
18190 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
181a0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
181b0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
181c0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
181d0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
181e0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
181f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18200 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
18210 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18220 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
18230 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
18240 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
18250 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
18260 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
18270 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
18280 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
18290 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
182a0 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
182b0 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
182c0 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
182d0 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
182e0 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
182f0 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
18300 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
18310 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18320 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
18330 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
18340 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
18350 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18360 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
18370 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
18380 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
18390 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
183a0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
183b0 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
183c0 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
183d0 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
183e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
183f0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
18400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18410 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
18420 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
18430 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
18440 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
18450 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
18460 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
18470 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
18480 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
18490 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
184a0 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
184b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
184c0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
184d0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
184e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
184f0 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20  ex);.  pBtree = 
18500 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
18510 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
18520 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
18530 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
18540 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
18550 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20  3_file *fd;.    
18560 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18570 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
18580 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
18590 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65  treePager(pBtree
185a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
185b0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
185c0 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
185d0 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
185e0 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
185f0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   );.    if( op==
18600 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
18610 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
18620 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
18630 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20  e**)pArg = fd;. 
18640 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18650 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
18660 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  f( fd->pMethods 
18670 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
18680 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
18690 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29  ol(fd, op, pArg)
186a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
186b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
186c0 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20  OTFOUND;.    }. 
186d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
186e0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
186f0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
18700 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18710 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
18720 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74     .}../*.** Int
18730 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
18740 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
18750 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
18760 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
18770 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
18780 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
18790 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
187a0 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20  _TEST.  va_list 
187b0 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
187c0 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
187d0 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
187e0 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
187f0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
18800 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
18810 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
18820 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
18830 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
18840 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
18850 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
18860 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
18870 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
18880 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
18890 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
188a0 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
188b0 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
188c0 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
188d0 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
188e0 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
188f0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
18900 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
18910 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
18920 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
18930 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
18940 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
18950 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
18960 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
18970 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18980 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
18990 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
189a0 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
189b0 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
189c0 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
189d0 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
189e0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
189f0 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
18a00 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
18a10 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
18a20 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
18a30 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
18a40 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
18a50 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
18a60 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
18a70 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
18a80 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
18a90 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20  ess(0,0);.      
18aa0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
18ab0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
18ac0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
18ad0 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
18ae0 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
18af0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
18b00 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
18b10 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
18b20 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
18b30 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
18b40 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
18b50 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
18b60 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
18b70 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
18b80 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
18b90 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
18ba0 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
18bb0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
18bc0 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
18bd0 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
18be0 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
18bf0 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
18c00 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
18c10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
18c20 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
18c30 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
18c40 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
18c50 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
18c60 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
18c70 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
18c80 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
18c90 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
18ca0 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
18cb0 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
18cc0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
18cd0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
18ce0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41  _test_control(FA
18cf0 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61  ULT_INSTALL, xCa
18d00 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20  llback).    **. 
18d10 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f     ** Arrange to
18d20 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63   invoke xCallbac
18d30 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c  k() whenever sql
18d40 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69  ite3FaultSim() i
18d50 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a  s called,.    **
18d60 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73   if xCallback is
18d70 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a   not NULL..    *
18d80 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65  *.    ** As a te
18d90 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20  st of the fault 
18da0 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e  simulator mechan
18db0 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69  ism itself, sqli
18dc0 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20  te3FaultSim(0). 
18dd0 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20     ** is called 
18de0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
18df0 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65  r installing the
18e00 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e   new callback an
18e10 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20  d the return.   
18e20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73   ** value from s
18e30 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
18e40 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65  ) becomes the re
18e50 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  turn from.    **
18e60 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
18e70 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a  ntrol()..    */.
18e80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18e90 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49  TESTCTRL_FAULT_I
18ea0 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  NSTALL: {.      
18eb0 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
18ec0 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
18ed0 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
18ee0 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
18ef0 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
18f00 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
18f10 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
18f20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18f30 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
18f40 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  k = va_arg(ap, i
18f50 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20  nt(*)(int));.   
18f60 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
18f70 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c  def int(*TESTCAL
18f80 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74  LBACKFUNC_t)(int
18f90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18fa0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65  GlobalConfig.xTe
18fb0 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f  stCallback = va_
18fc0 61 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c  arg(ap, TESTCALL
18fd0 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20  BACKFUNC_t);.   
18fe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
18ff0 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20  aultSim(0);.    
19000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
19010 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
19020 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19030 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
19040 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
19050 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
19060 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
19070 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
19080 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
19090 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
190a0 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
190b0 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
190c0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
190d0 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
190e0 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
190f0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
19100 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
19110 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
19120 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
19130 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
19140 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
19150 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
19160 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
19170 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
19180 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
19190 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
191a0 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
191b0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
191c0 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
191d0 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
191e0 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
191f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19200 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
19210 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
19220 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
19230 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
19240 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
19250 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
19260 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
19270 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
19280 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
19290 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
192a0 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
192b0 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
192c0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
192d0 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
192e0 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
192f0 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
19300 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
19310 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
19320 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
19330 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
19340 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
19350 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
19360 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
19370 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
19380 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
19390 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
193a0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
193b0 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
193c0 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
193d0 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
193e0 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
193f0 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
19400 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  eleterious behav
19410 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
19420 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
19430 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
19440 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
19450 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
19460 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19470 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
19480 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
19490 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
194a0 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
194b0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
194c0 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
194d0 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
194e0 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
194f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
19500 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
19510 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
19520 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
19530 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
19540 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
19550 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
19560 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
19570 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
19580 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
19590 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
195a0 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
195b0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
195c0 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
195d0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
195e0 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
195f0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
19600 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
19610 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
19620 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
19630 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
19640 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
19650 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
19660 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
19670 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
19680 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
19690 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
196a0 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
196b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
196c0 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
196d0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
196e0 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
196f0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
19700 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
19710 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
19720 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
19730 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
19740 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
19750 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
19760 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61  ssert( (x = va_a
19770 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
19780 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
19790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
197a0 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
197b0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
197c0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
197d0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
197e0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
197f0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
19800 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
19810 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
19820 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
19830 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
19840 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
19850 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
19860 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
19870 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
19880 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
19890 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
198a0 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
198b0 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
198c0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
198d0 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
198e0 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
198f0 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
19900 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
19910 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
19920 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
19930 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
19940 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
19950 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
19960 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
19970 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
19980 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
19990 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
199a0 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
199b0 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
199c0 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
199d0 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
199e0 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
199f0 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
19a00 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
19a10 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
19a20 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
19a30 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
19a40 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
19a50 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
19a60 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
19a70 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
19a80 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
19a90 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
19aa0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
19ab0 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
19ac0 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
19ad0 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
19ae0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
19af0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
19b00 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
19b10 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
19b20 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
19b30 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
19b40 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
19b50 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
19b60 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
19b70 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
19b80 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
19b90 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
19ba0 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
19bb0 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
19bc0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
19bd0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
19be0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
19bf0 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
19c00 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
19c10 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
19c20 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
19c30 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
19c40 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
19c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
19c60 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
19c70 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
19c80 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
19c90 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
19ca0 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
19cb0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
19cc0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
19cd0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
19ce0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
19cf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
19d00 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
19d10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
19d20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c   /*.    **   sql
19d30 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
19d40 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
19d50 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20  L_BYTEORDER);.  
19d60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19d70 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64  integer returned
19d80 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74   reveals the byt
19d90 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63  e-order of the c
19da0 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68  omputer on which
19db0 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69  .    ** SQLite i
19dc0 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a  s running:.    *
19dd0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31  *.    **       1
19de0 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
19df0 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
19e00 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
19e10 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69  *      10     li
19e20 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
19e30 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
19e40 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31  ime.    **  4321
19e50 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61  01     big-endia
19e60 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
19e70 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
19e80 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20  .    **  123410 
19e90 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61      little-endia
19ea0 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74  n, determined at
19eb0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
19ec0 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53    */ .    case S
19ed0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
19ee0 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20  YTEORDER: {.    
19ef0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59    rc = SQLITE_BY
19f00 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51  TEORDER*100 + SQ
19f10 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41  LITE_LITTLEENDIA
19f20 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49  N*10 + SQLITE_BI
19f30 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62  GENDIAN;.      b
19f40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
19f50 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
19f60 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
19f70 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
19f80 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
19f90 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
19fa0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
19fb0 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
19fc0 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
19fd0 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
19fe0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
19ff0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
1a000 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1a010 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
1a020 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
1a030 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1a040 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1a050 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
1a060 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1a070 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1a080 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1a090 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
1a0a0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
1a0b0 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
1a0c0 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
1a0d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1a0e0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1a0f0 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1a100 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1a110 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a120 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1a130 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1a140 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
1a150 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1a160 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
1a170 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
1a180 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
1a190 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
1a1a0 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
1a1b0 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
1a1c0 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
1a1d0 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
1a1e0 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
1a1f0 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
1a200 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
1a210 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
1a220 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
1a230 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
1a240 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
1a250 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
1a260 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
1a270 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
1a280 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
1a290 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
1a2a0 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
1a2b0 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
1a2c0 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
1a2d0 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
1a2e0 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
1a2f0 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
1a300 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1a310 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
1a320 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
1a330 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1a340 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1a350 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1a360 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31  dbOptFlags = (u1
1a370 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  6)(va_arg(ap, in
1a380 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20  t) & 0xffff);.  
1a390 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a3a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a3b0 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a  N_KEYWORD.    /*
1a3c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1a3d0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1a3e0 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c  TCTRL_ISKEYWORD,
1a3f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
1a400 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rd).    **.    *
1a410 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20  * If zWord is a 
1a420 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a  keyword recogniz
1a430 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1a440 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
1a450 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
1a460 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  of keywords.  Or
1a470 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74   if zWord is not
1a480 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75   a keyword, retu
1a490 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  rn 0..    ** .  
1a4a0 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66    ** This test f
1a4b0 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61  eature is only a
1a4c0 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
1a4d0 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e  amalgamation sin
1a4e0 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51  ce.    ** the SQ
1a4f0 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d  LITE_N_KEYWORD m
1a500 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
1a510 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
1a520 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a   if SQLite.    *
1a530 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67  * is built using
1a540 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65   separate source
1a550 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
1a560 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1a570 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
1a580 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D: {.      const
1a590 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76   char *zWord = v
1a5a0 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
1a5b0 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e  char*);.      in
1a5c0 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
1a5d0 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20  len30(zWord);.  
1a5e0 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65      rc = (sqlite
1a5f0 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38  3KeywordCode((u8
1a600 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f  *)zWord, n)!=TK_
1a610 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b  ID) ? SQLITE_N_K
1a620 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20  EYWORD : 0;.    
1a630 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1a640 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73  endif ..    /* s
1a650 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1a660 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1a670 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
1a680 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46  C, sz, &pNew, pF
1a690 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ree);.    **.   
1a6a0 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69   ** Pass pFree i
1a6b0 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74  nto sqlite3Scrat
1a6c0 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a  chFree(). .    *
1a6d0 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61  * If sz>0 then a
1a6e0 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63  llocate a scratc
1a6f0 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e  h buffer into pN
1a700 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ew.  .    */.   
1a710 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1a720 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
1a730 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  LOC: {.      voi
1a740 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65  d *pFree, **ppNe
1a750 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  w;.      int sz;
1a760 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61  .      sz = va_a
1a770 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1a780 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72     ppNew = va_ar
1a790 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20  g(ap, void**);. 
1a7a0 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f       pFree = va_
1a7b0 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
1a7c0 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a        if( sz ) *
1a7d0 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  ppNew = sqlite3S
1a7e0 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29  cratchMalloc(sz)
1a7f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
1a800 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65  cratchFree(pFree
1a810 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a820 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1a830 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a840 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1a850 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1a860 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29  AULT, int onoff)
1a870 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1a880 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f  If parameter ono
1a890 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ff is non-zero, 
1a8a0 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72  configure the wr
1a8b0 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61  appers so that a
1a8c0 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71  ll.    ** subseq
1a8d0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f  uent calls to lo
1a8e0 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61  caltime() and va
1a8f0 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20  riants fail. If 
1a900 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20  onoff is zero,. 
1a910 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20     ** undo this 
1a920 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1a930 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a940 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1a950 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
1a960 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1a970 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
1a980 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
1a990 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1a9a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
1a9b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a9c0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
1a9d0 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73 71  AIN).    /*   sq
1a9e0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1a9f0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1aa00 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 2c  RL_EXPLAIN_STMT,
1aa10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1aa30 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f 6e  qlite3_stmt*,con
1aa40 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20  st char**);.    
1aa50 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f 6d  **.    ** If com
1aa60 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
1aa70 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1aa80 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71 6c 69  PLAIN, each sqli
1aa90 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a 20  te3_stmt holds. 
1aaa0 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20 74     ** a string t
1aab0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
1aac0 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61 72 73  e optimized pars
1aad0 65 20 74 72 65 65 2e 20 20 54 68 69 73 20 74 65  e tree.  This te
1aae0 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20 2a  st-control.    *
1aaf0 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
1ab00 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72 69  ter to that stri
1ab10 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
1ab20 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1ab30 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54  TRL_EXPLAIN_STMT
1ab40 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1ab50 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1ab60 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1ab70 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20 20  e3_stmt*);.     
1ab80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
1ab90 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Ret = va_arg(ap,
1aba0 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a   const char**);.
1abb0 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d 20 73        *pzRet = s
1abc0 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e  qlite3VdbeExplan
1abd0 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70 53 74  ation((Vdbe*)pSt
1abe0 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mt);.      break
1abf0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1ac00 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1ac10 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1ac20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
1ac30 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74  VER_CORRUPT, int
1ac40 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1ac50 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20   Set or clear a 
1ac60 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
1ac70 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74  tes that the dat
1ac80 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c  abase file is al
1ac90 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a  ways well-.    *
1aca0 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76  * formed and nev
1acb0 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69  er corrupt.  Thi
1acc0 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  s flag is clear 
1acd0 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69  by default, indi
1ace0 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20  cating that.    
1acf0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1ad00 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72 62  s might have arb
1ad10 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f  itrary corruptio
1ad20 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  n.  Setting the 
1ad30 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20  flag during.    
1ad40 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73 65  ** testing cause
1ad50 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74  s certain assert
1ad60 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
1ad70 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20   the code to be 
1ad80 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a  activated.    **
1ad90 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74   that demonstrat
1ada0 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77   invariants on w
1adb0 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
1adc0 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  ase files..    *
1add0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ade0 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
1adf0 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  _CORRUPT: {.    
1ae00 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1ae10 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75  onfig.neverCorru
1ae20 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  pt = va_arg(ap, 
1ae30 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1ae40 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1ae50 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1ae60 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1ae70 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1ae80 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63  VERAGE, xCallbac
1ae90 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a  k, ptr);.    **.
1aea0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56      ** Set the V
1aeb0 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c  DBE coverage cal
1aec0 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
1aed0 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68  o xCallback with
1aee0 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a   context .    **
1aef0 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20   pointer ptr..  
1af00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1af10 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1af20 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23  BE_COVERAGE: {.#
1af30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1af40 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20  E_COVERAGE.     
1af50 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1af60 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1af70 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38  (void*,int,u8,u8
1af80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1af90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
1afa0 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
1afb0 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
1afc0 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
1afd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1afe0 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
1aff0 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
1b000 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
1b010 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1b020 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1b030 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1b040 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1b050 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d  TER_MMAP, db, nM
1b060 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  ax); */.    case
1b070 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1b080 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
1b090 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1b0a0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1b0b0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1b0c0 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
1b0d0 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
1b0e0 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1b0f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1b100 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1b110 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1b120 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b  ESTCTRL_ISINIT);
1b130 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1b140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1b150 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65  if SQLite has be
1b160 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
1b170 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
1b180 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20  if.    ** not.. 
1b190 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1b1a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1b1b0 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69  SINIT: {.      i
1b1c0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1b1d0 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1b1e0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
1b1f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1b200 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
1b210 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
1b220 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b230 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
1b240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
1b260 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65   utility routine
1b270 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20  , useful to VFS 
1b280 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c  implementations,
1b290 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20   that checks.** 
1b2a0 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61  to see if a data
1b2b0 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20  base file was a 
1b2c0 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  URI that contain
1b2d0 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75  ed a specific qu
1b2e0 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ery .** paramete
1b2f0 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74  r, and if so obt
1b300 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  ains the value o
1b310 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61  f the query para
1b320 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
1b330 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
1b340 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e  ent is the filen
1b350 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73  ame pointer pass
1b360 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65  ed into the xOpe
1b370 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  n().** method of
1b380 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74   a VFS implement
1b390 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72  ation.  The zPar
1b3a0 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  am argument is t
1b3b0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1b3c0 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
1b3d0 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73  r we seek.  This
1b3e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1b3f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1b400 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61  e zParam.** para
1b410 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73  meter if it exis
1b420 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61  ts.  If the para
1b430 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65  meter does not e
1b440 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  xist, this routi
1b450 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  ne.** returns a 
1b460 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
1b470 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1b480 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1b490 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
1b4a0 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
1b4b0 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20  char *zParam){. 
1b4c0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
1b4d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1b4e0 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1b4f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1b500 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77  lename) + 1;.  w
1b510 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b  hile( zFilename[
1b520 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  0] ){.    int x 
1b530 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  = strcmp(zFilena
1b540 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20  me, zParam);.   
1b550 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1b560 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1b570 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1b580 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74    if( x==0 ) ret
1b590 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  urn zFilename;. 
1b5a0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
1b5b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1b5c0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
1b5d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1b5e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b5f0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  a boolean value 
1b600 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1b610 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  meter..*/.int sq
1b620 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
1b630 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
1b640 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
1b650 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74  har *zParam, int
1b660 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74   bDflt){.  const
1b670 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
1b680 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
1b690 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
1b6a0 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62  am);.  bDflt = b
1b6b0 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72  Dflt!=0;.  retur
1b6c0 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74  n z ? sqlite3Get
1b6d0 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74  Boolean(z, bDflt
1b6e0 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  ) : bDflt;.}../*
1b6f0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d  .** Return a 64-
1b700 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
1b710 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
1b720 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69  rameter..*/.sqli
1b730 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1b740 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63  3_uri_int64(.  c
1b750 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1b760 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65  name,    /* File
1b770 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74  name as passed t
1b780 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e  o xOpen */.  con
1b790 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
1b7a0 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61         /* URI pa
1b7b0 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a  rameter sought *
1b7c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1b7d0 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a  4 bDflt       /*
1b7e0 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d   return if param
1b7f0 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  eter is missing 
1b800 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1b810 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
1b820 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46  uri_parameter(zF
1b830 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1b840 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
1b850 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20  4 v;.  if( z && 
1b860 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
1b870 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c  oI64(z, &v)==SQL
1b880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44  ITE_OK ){.    bD
1b890 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  flt = v;.  }.  r
1b8a0 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a  eturn bDflt;.}..
1b8b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1b8c0 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69   Btree pointer i
1b8d0 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62  dentified by zDb
1b8e0 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  Name.  Return NU
1b8f0 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1b900 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74  .*/.Btree *sqlit
1b910 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1b920 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1b930 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1b940 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1b950 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1b960 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1b970 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20  db->aDb[i].pBt. 
1b980 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d      && (zDbName=
1b990 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
1b9a0 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62  ICmp(zDbName, db
1b9b0 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ->aDb[i].zName)=
1b9c0 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
1b9d0 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b   return db->aDb[
1b9e0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20  i].pBt;.    }.  
1b9f0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1ba00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ba10 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
1ba20 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1ba30 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1ba40 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
1ba50 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
1ba60 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66  ar *sqlite3_db_f
1ba70 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20  ilename(sqlite3 
1ba80 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1ba90 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
1baa0 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65  ee *pBt = sqlite
1bab0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1bac0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
1bad0 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
1bae0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
1baf0 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a  ame(pBt) : 0;.}.
1bb00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
1bb10 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72  if database is r
1bb20 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66  ead-only or 0 if
1bb30 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65   read/write.  Re
1bb40 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f  turn -1 if.** no
1bb50 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65   such database e
1bb60 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
1bb70 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
1bb80 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  y(sqlite3 *db, c
1bb90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1bba0 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1bbb0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
1bbc0 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1bbd0 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1bbe0 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
1bbf0 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74  eeIsReadonly(pBt
1bc00 29 20 3a 20 2d 31 3b 0a 7d 0a                    ) : -1;.}.