/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 887077056c8a20bf2880a27096d7a40630f6257a:


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 72 65 74 75 72 6e 20 53 51  ){.    return SQ
64c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
64d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
64e0: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
64f0: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
6500: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6510: 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
6520: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
6530: 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  b->mutex);..  /*
6540: 20 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e 65   Force xDisconne
6550: 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20  ct calls on all 
6560: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
6570: 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  /.  disconnectAl
6580: 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a  lVtab(db);..  /*
6590: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
65a0: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 64  n is open, the d
65b0: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
65c0: 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20  () call above.  
65d0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65  ** will not have
65e0: 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73   called the xDis
65f0: 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  connect() method
6600: 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a   on any virtual.
6610: 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74    ** tables in t
6620: 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d  he db->aVTrans[]
6630: 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c   array. The foll
6640: 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61  owing sqlite3Vta
6650: 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a  bRollback().  **
6660: 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f   call will do so
6670: 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20  . We need to do 
6680: 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20  this before the 
6690: 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65  check for active
66a0: 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
66b0: 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74  ents below, as t
66c0: 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65  he v-table imple
66d0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65  mentation may be
66e0: 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f   storing.  ** so
66f0: 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  me prepared stat
6700: 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c  ements internall
6710: 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
6720: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
6730: 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20  );..  /* Legacy 
6740: 62 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74 65  behavior (sqlite
6750: 33 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76 69  3_close() behavi
6760: 6f 72 29 20 69 73 20 74 6f 20 72 65 74 75 72 6e  or) is to return
6770: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  .  ** SQLITE_BUS
6780: 59 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  Y if the connect
6790: 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 63  ion can not be c
67a0: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
67b0: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 66  y..  */.  if( !f
67c0: 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f  orceZombie && co
67d0: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
67e0: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
67f0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
6800: 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20  E_BUSY, "unable 
6810: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
6820: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20  unfinalized ".  
6830: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
6840: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62   or unfinished b
6850: 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71  ackups");.    sq
6860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6870: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
6880: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6890: 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  BUSY;.  }..#ifde
68a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
68b0: 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
68c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
68d0: 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
68e0: 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68  /* Closing the h
68f0: 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
6900: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
6910: 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a  d the value 2. *
6920: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  /.    sqlite3Glo
6930: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
6940: 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g(sqlite3GlobalC
6950: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
6960: 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d  , db, 0, 2);.  }
6970: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
6980: 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63  nvert the connec
6990: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62  tion into a zomb
69a0: 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73  ie and then clos
69b0: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d  e it..  */.  db-
69c0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
69d0: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20  MAGIC_ZOMBIE;.  
69e0: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
69f0: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
6a00: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
6a10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6a20: 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73  * Two variations
6a30: 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69   on the public i
6a40: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f  nterface for clo
6a50: 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  sing a database.
6a60: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  ** connection. T
6a70: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
6a80: 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72  () version retur
6a90: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ns SQLITE_BUSY a
6aa0: 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65  nd.** leaves the
6ab0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69   connection opti
6ac0: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
6ad0: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70  unfinalized prep
6ae0: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
6af0: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
6b00: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73   sqlite3_backups
6b10: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  .  The sqlite3_c
6b20: 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72  lose_v2().** ver
6b30: 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20  sion forces the 
6b40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
6b50: 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66  come a zombie if
6b60: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e   there are.** un
6b70: 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73  closed resources
6b80: 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66  , and arranges f
6b90: 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  or deallocation 
6ba0: 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a  when the last.**
6bb0: 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
6bc0: 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  nt or sqlite3_ba
6bd0: 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a  ckup closes..*/.
6be0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
6bf0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  e(sqlite3 *db){ 
6c00: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
6c10: 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74  ose(db,0); }.int
6c20: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6c30: 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20  2(sqlite3 *db){ 
6c40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c  return sqlite3Cl
6c50: 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f  ose(db,1); }.../
6c60: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d  *.** Close the m
6c70: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
6c80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
6c90: 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72  **.** Furthermor
6ca0: 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63  e, if database c
6cb0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
6cc0: 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e  a zombie (meanin
6cd0: 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20  g that there.** 
6ce0: 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72  has been a prior
6cf0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
6d00: 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71  _close(db) or sq
6d10: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64  lite3_close_v2(d
6d20: 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79  b)) and.** every
6d30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61   sqlite3_stmt ha
6d40: 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c  s now been final
6d50: 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73  ized and every s
6d60: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61  qlite3_backup ha
6d70: 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74  s.** finished, t
6d80: 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73  hen free all res
6d90: 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ources..*/.void 
6da0: 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65  sqlite3LeaveMute
6db0: 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28  xAndCloseZombie(
6dc0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6dd0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
6e00: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
6e10: 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  j;..  /* If ther
6e20: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
6e30: 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  g sqlite3_stmt o
6e40: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
6e50: 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72   objects.  ** or
6e60: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
6e70: 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  on has not yet b
6e80: 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71  een closed by sq
6e90: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
6ea0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74  ,.  ** then just
6eb0: 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78   leave the mutex
6ec0: 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
6ed0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69  /.  if( db->magi
6ee0: 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c!=SQLITE_MAGIC_
6ef0: 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63  ZOMBIE || connec
6f00: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
6f10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
6f20: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
6f30: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
6f40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
6f50: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
6f60: 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
6f70: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
6f80: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20  onnection has.  
6f90: 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71  ** closed all sq
6fa0: 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73  lite3_stmt and s
6fb0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
6fc0: 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65  jects and has be
6fd0: 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74  en.  ** passed t
6fe0: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20  o sqlite3_close 
6ff0: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74  (meaning that it
7000: 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20   is a zombie).  
7010: 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20  Therefore,.  ** 
7020: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65  go ahead and fre
7030: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
7040: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  .  */..  /* If a
7050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7060: 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61  open, roll it ba
7070: 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e  ck. This also en
7080: 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20  sures that if.  
7090: 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  ** any database 
70a0: 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65  schemas have bee
70b0: 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e  n modified by an
70c0: 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61   uncommitted tra
70d0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68  nsaction.  ** th
70e0: 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e  ey are reset. An
70f0: 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69  d that the requi
7100: 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
7110: 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65   is held to make
7120: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20  .  ** the pager 
7130: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
7140: 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f  ema reset an ato
7150: 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a  mic operation. *
7160: 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  /.  sqlite3Rollb
7170: 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
7180: 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  E_OK);..  /* Fre
7190: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
71a0: 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  g Savepoint stru
71b0: 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctures. */.  sql
71c0: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
71d0: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43  nts(db);..  /* C
71e0: 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73  lose all databas
71f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
7200: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
7210: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
7220: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
7230: 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20  = &db->aDb[j];. 
7240: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
7250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7260: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
7270: 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  pBt);.      pDb-
7280: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >pBt = 0;.      
7290: 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20  if( j!=1 ){.    
72a0: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
72b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
72c0: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65    }.  }.  /* Cle
72d0: 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65  ar the TEMP sche
72e0: 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e  ma separately an
72f0: 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20  d last */.  if( 
7300: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
7310: 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ma ){.    sqlite
7320: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d  3SchemaClear(db-
7330: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
7340: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
7350: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
7360: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70  );..  /* Free up
7370: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75   the array of au
7380: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
7390: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f  s */.  sqlite3Co
73a0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
73b0: 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72  ray(db);.  asser
73c0: 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b  t( db->nDb<=2 );
73d0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
73e0: 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db==db->aDbStati
73f0: 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20  c );..  /* Tell 
7400: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
7410: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
7420: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
7430: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
7440: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
7450: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
7460: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
7470: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
7480: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
7490: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
74a0: 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  (db);..  for(j=0
74b0: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62  ; j<ArraySize(db
74c0: 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29  ->aFunc.a); j++)
74d0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
74e0: 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70  Next, *pHash, *p
74f0: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e  ;.    for(p=db->
7500: 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70  aFunc.a[j]; p; p
7510: 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70  =pHash){.      p
7520: 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b  Hash = p->pHash;
7530: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
7540: 29 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74  ){.        funct
7550: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
7560: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
7570: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
7580: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
7590: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
75a0: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
75b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
75c0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
75d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
75e0: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
75f0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
7600: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
7610: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
7620: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
7630: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
7640: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
7650: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
7660: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7670: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
7680: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
7690: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
76a0: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
76b0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
76c0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
76d0: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
76e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
76f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7700: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
7710: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
7720: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
7730: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7740: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
7750: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
7760: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
7770: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
7780: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
7790: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
77a0: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
77b0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
77c0: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
77d0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
77e0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
77f0: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
7800: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
7810: 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ree(db, pMod);. 
7820: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
7830: 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75  Clear(&db->aModu
7840: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  le);.#endif..  s
7850: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
7860: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f  SQLITE_OK, 0); /
7870: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
7880: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
7890: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
78a0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
78b0: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
78c0: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
78d0: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
78e0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
78f0: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
7900: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
7910: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
7920: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
7930: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
7940: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
7950: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
7960: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
7970: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
7980: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
7990: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
79a0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
79b0: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
79c0: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
79d0: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
79e0: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
79f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
7a00: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
7a10: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
7a20: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
7a30: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
7a40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7a50: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
7a60: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
7a70: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7a80: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
7a90: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
7aa0: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
7ab0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
7ac0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
7ad0: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
7ae0: 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f  de.nOut==0 );  /
7af0: 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f  * Fails on a loo
7b00: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65  kaside memory le
7b10: 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ak */.  if( db->
7b20: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
7b30: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
7b40: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
7b50: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
7b60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
7b70: 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(db);.}../*.** 
7b80: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
7b90: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66  abase files.  If
7ba0: 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
7bb0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
7bc0: 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  .** any open cur
7bd0: 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
7be0: 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20  ated ("tripped" 
7bf0: 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e  - as in "trippin
7c00: 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62  g a circuit.** b
7c10: 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64  reaker") and mad
7c20: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70  e to return trip
7c30: 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72  Code if there ar
7c40: 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a  e any further.**
7c50: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65   attempts to use
7c60: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f   that cursor..*/
7c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
7c80: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
7c90: 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f   *db, int tripCo
7ca0: 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  de){.  int i;.  
7cb0: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
7cc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7cd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
7ce0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
7cf0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
7d00: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20  Malloc();..  /* 
7d10: 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65  Obtain all b-tre
7d20: 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65  e mutexes before
7d30: 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c   making any call
7d40: 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61  s to BtreeRollba
7d50: 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73  ck(). .  ** This
7d60: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
7d70: 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
7d80: 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c  ction being roll
7d90: 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a  ed back has.  **
7da0: 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
7db0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
7dc0: 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  f the b-tree mut
7dd0: 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b  exes are not tak
7de0: 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68  en.  ** here, th
7df0: 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65  en another share
7e00: 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69  d-cache connecti
7e10: 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  on might sneak i
7e20: 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  n between.  ** t
7e30: 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c  he database roll
7e40: 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20  back and schema 
7e50: 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e  reset, which can
7e60: 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a   cause false.  *
7e70: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70  * corruption rep
7e80: 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73  orts in some cas
7e90: 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  es.  */.  sqlite
7ea0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
7eb0: 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  b);..  for(i=0; 
7ec0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7ed0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
7ee0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
7ef0: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
7f00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
7f10: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
7f20: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
7f30: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
7f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7f50: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72  eeRollback(p, tr
7f60: 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  ipCode);.    }. 
7f70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
7f80: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
7f90: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
7fa0: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
7fb0: 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
7fc0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
7fd0: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
7fe0: 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
7ff0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
8000: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
8010: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
8020: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
8030: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
8040: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
8050: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
8060: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
8070: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
8080: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
8090: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
80a0: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
80b0: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
80c0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
80d0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
80e0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
80f0: 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a  _DeferFKs;..  /*
8100: 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e   If one has been
8110: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76   configured, inv
8120: 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  oke the rollback
8130: 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  -hook callback *
8140: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c  /.  if( db->xRol
8150: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26  lbackCallback &&
8160: 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62   (inTrans || !db
8170: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b  ->autoCommit) ){
8180: 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  .    db->xRollba
8190: 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  ckCallback(db->p
81a0: 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20  RollbackArg);.  
81b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
81c0: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
81d0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
81e0: 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64   name correspond
81f0: 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ing to the error
8200: 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69   code.** specifi
8210: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
8220: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  nt..*/.#if defin
8230: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
8240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
8250: 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72  te3ErrName(int r
8260: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c){.  const char
8270: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
8280: 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72  nt i, origRc = r
8290: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
82a0: 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69  2 && zName==0; i
82b0: 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b  ++, rc &= 0xff){
82c0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20  .    switch( rc 
82d0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ){.      case SQ
82e0: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
82f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8300: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20   "SQLITE_OK";   
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8320: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8330: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
8340: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8350: 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  = "SQLITE_ERROR"
8360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
8370: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8380: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a  SQLITE_INTERNAL:
8390: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
83a0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
83b0: 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  NAL";          b
83c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
83d0: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20   SQLITE_PERM:   
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
83f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d  e = "SQLITE_PERM
8400: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
8410: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8420: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
8440: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
8450: 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RT";            
8460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8470: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
8480: 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e  ROLLBACK:     zN
8490: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
84a0: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20  ORT_ROLLBACK";  
84b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
84c0: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
84e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
84f0: 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  USY";           
8500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8510: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
8520: 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20  _RECOVERY:      
8530: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8540: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  BUSY_RECOVERY"; 
8550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8560: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
8570: 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20  Y_SNAPSHOT:     
8580: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8590: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b  _BUSY_SNAPSHOT";
85a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
85b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
85c0: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
85d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
85e0: 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20  E_LOCKED";      
85f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8600: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
8610: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
8620: 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  E: zName = "SQLI
8630: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
8640: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
8650: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8660: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20  NOMEM:          
8670: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8680: 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ITE_NOMEM";     
8690: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
86a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
86b0: 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20  _READONLY:      
86c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
86d0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20  LITE_READONLY"; 
86e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
86f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8700: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
8710: 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ERY:  zName = "S
8720: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
8730: 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b  ECOVERY"; break;
8740: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8750: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
8760: 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  LOCK:  zName = "
8770: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
8780: 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  CANTLOCK"; break
8790: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
87a0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
87b0: 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  LBACK:  zName = 
87c0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
87d0: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61  _ROLLBACK"; brea
87e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
87f0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
8800: 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  MOVED:   zName =
8810: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
8820: 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65  Y_DBMOVED";  bre
8830: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8840: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a  QLITE_INTERRUPT:
8850: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8860: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  = "SQLITE_INTERR
8870: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72  UPT";         br
8880: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8890: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20  SQLITE_IOERR:   
88a0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
88b0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
88c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
88d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
88e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
88f0: 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AD:         zNam
8900: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8910: 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20  R_READ";        
8920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8930: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8940: 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61  HORT_READ:   zNa
8950: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8960: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20  RR_SHORT_READ"; 
8970: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8980: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8990: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e  WRITE:        zN
89a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
89b0: 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20  ERR_WRITE";     
89c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
89d0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
89e0: 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a  _FSYNC:        z
89f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8a00: 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20  OERR_FSYNC";    
8a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8a20: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8a30: 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20  R_DIR_FSYNC:    
8a40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8a50: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22  IOERR_DIR_FSYNC"
8a60: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
8a70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8a80: 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20  RR_TRUNCATE:    
8a90: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8aa0: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22  _IOERR_TRUNCATE"
8ab0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
8ac0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8ad0: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
8ae0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8af0: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20  E_IOERR_FSTAT"; 
8b00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8b10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8b20: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20  OERR_UNLOCK:    
8b30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8b40: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
8b50: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8b60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8b70: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20  IOERR_RDLOCK:   
8b80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8b90: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
8ba0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8bb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8bc0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20  _IOERR_DELETE:  
8bd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8be0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
8bf0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
8c00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8c10: 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3a  E_IOERR_BLOCKED:
8c20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8c30: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
8c40: 4b 45 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  KED";     break;
8c50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8c60: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20  TE_IOERR_NOMEM: 
8c70: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8c80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
8c90: 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  EM";       break
8ca0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8cb0: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
8cc0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
8cd0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  "SQLITE_IOERR_AC
8ce0: 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61  CESS";      brea
8cf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8d00: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
8d10: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20  RESERVEDLOCK:.  
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
8d40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8d50: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
8d60: 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  DLOCK"; break;. 
8d70: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8d80: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20  _IOERR_LOCK:    
8d90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8da0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22  LITE_IOERR_LOCK"
8db0: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
8dc0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8dd0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20  E_IOERR_CLOSE:  
8de0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8df0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
8e00: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
8e10: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8e20: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
8e30: 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  SE:    zName = "
8e40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
8e50: 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b  _CLOSE";   break
8e60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8e70: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
8e80: 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  N:      zName = 
8e90: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
8ea0: 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61  MOPEN";     brea
8eb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8ec0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
8ed0: 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ZE:      zName =
8ee0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
8ef0: 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65  HMSIZE";     bre
8f00: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8f10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
8f20: 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  OCK:      zName 
8f30: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8f40: 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72  SHMLOCK";     br
8f50: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8f60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
8f70: 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  MAP:       zName
8f80: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8f90: 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62  _SHMMAP";      b
8fa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8fb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45   SQLITE_IOERR_SE
8fc0: 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  EK:         zNam
8fd0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8fe0: 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20  R_SEEK";        
8ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9000: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
9010: 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61  ELETE_NOENT: zNa
9020: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
9030: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22  RR_DELETE_NOENT"
9040: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
9050: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
9060: 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e  MMAP:         zN
9070: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
9080: 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20  ERR_MMAP";      
9090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
90a0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
90b0: 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a  _GETTEMPPATH:  z
90c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
90d0: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
90e0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
90f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
9100: 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20  R_CONVPATH:     
9110: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9120: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b  IOERR_CONVPATH";
9130: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9140: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
9150: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20  RUPT:           
9160: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9170: 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20  _CORRUPT";      
9180: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9190: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
91a0: 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20  RRUPT_VTAB:     
91b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
91c0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
91d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
91e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
91f0: 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20  OTFOUND:        
9200: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9210: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
9220: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9230: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9240: 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  FULL:           
9250: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9260: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
9270: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9280: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9290: 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20  _CANTOPEN:      
92a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
92b0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
92c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
92d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
92e0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
92f0: 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  PDIR: zName = "S
9300: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
9310: 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b  OTEMPDIR";break;
9320: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9330: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
9340: 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  R:     zName = "
9350: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
9360: 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b  ISDIR";    break
9370: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9380: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
9390: 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  LPATH:  zName = 
93a0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
93b0: 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61  _FULLPATH"; brea
93c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
93d0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
93e0: 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  NVPATH:  zName =
93f0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
9400: 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65  N_CONVPATH"; bre
9410: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9420: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
9430: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9440: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
9450: 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  OL";          br
9460: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9470: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
9480: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9490: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
94a0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
94b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
94c0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
94e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
94f0: 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  MA";            
9500: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9510: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9530: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f  me = "SQLITE_TOO
9540: 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  BIG";           
9550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9560: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
9570: 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  AINT:         zN
9580: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
9590: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
95a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
95b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
95c0: 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a  RAINT_UNIQUE:  z
95d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
95e0: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
95f0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
9600: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
9610: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20  TRAINT_TRIGGER: 
9620: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9630: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
9640: 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  ER";break;.     
9650: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9660: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
9670: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
96a0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
96b0: 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72  OREIGNKEY";   br
96c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
96d0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
96e0: 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65  T_CHECK:   zName
96f0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
9700: 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62  RAINT_CHECK";  b
9710: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9720: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9730: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20  NT_PRIMARYKEY:. 
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9760: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9770: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
9780: 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  YKEY";   break;.
9790: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
97a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
97b0: 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  NULL: zName = "S
97c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
97d0: 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b  _NOTNULL";break;
97e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
97f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
9800: 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20  MMITHOOK:.      
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9830: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9840: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22  AINT_COMMITHOOK"
9850: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9860: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9870: 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20  STRAINT_VTAB:   
9880: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9890: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
98a0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
98b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
98c0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
98d0: 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N:.             
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9900: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
9910: 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65  NCTION";     bre
9920: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9930: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9940: 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20  _ROWID:   zName 
9950: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9960: 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72  AINT_ROWID";  br
9970: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9980: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a  SQLITE_MISMATCH:
9990: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
99a0: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
99b0: 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62  TCH";          b
99c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
99d0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20   SQLITE_MISUSE: 
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
99f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
9a00: 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SE";            
9a10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9a20: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9a40: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
9a50: 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  FS";            
9a60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9a70: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9a90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
9aa0: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
9ab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9ac0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
9ad0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
9ae0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
9af0: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
9b00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9b10: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
9b20: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
9b30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9b40: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20  RANGE";         
9b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9b60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
9b70: 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20  ADB:            
9b80: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9b90: 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20  _NOTADB";       
9ba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9bb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
9bc0: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
9bd0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9be0: 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20  E_ROW";         
9bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
9c10: 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20  OTICE:          
9c20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9c30: 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20  TE_NOTICE";     
9c40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9c50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9c60: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
9c70: 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  AL: zName = "SQL
9c80: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
9c90: 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20  ER_WAL";break;. 
9ca0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9cb0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
9cc0: 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20  ROLLBACK:.      
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9cf0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
9d00: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
9d10: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
9d20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
9d30: 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20  NING:           
9d40: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9d50: 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20  _WARNING";      
9d60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9d70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
9d80: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a  RNING_AUTOINDEX:
9d90: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9da0: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
9db0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
9dc0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
9dd0: 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ONE:            
9de0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9df0: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
9e00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9e10: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e    }.  }.  if( zN
9e20: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ame==0 ){.    st
9e30: 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35  atic char zBuf[5
9e40: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
9e50: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
9e60: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51  zBuf), zBuf, "SQ
9e70: 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29  LITE_UNKNOWN(%d)
9e80: 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20  ", origRc);.    
9e90: 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zName = zBuf;.  
9ea0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
9eb0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
9ec0: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
9ed0: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
9ee0: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
9ef0: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
9f00: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
9f10: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
9f20: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
9f30: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
9f40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
9f50: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
9f60: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
9f70: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
9f80: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
9f90: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
9fa0: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
9fb0: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
9fc0: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
9fd0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
9fe0: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
9ff0: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
a000: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
a010: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
a020: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
a030: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
a040: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
a050: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
a060: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
a070: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
a080: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
a090: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
a0a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
a0b0: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
a0c0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
a0d0: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
a0e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
a0f0: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
a100: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
a110: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
a120: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
a130: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
a140: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
a150: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
a160: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
a170: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
a180: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
a190: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
a1a0: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
a1b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
a1c0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
a1d0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
a1e0: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
a1f0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
a200: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
a210: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
a220: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
a230: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
a240: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
a250: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a260: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
a270: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
a280: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
a290: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
a2a0: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
a2b0: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
a2c0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
a2d0: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
a2e0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
a2f0: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
a300: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
a310: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
a320: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
a330: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a340: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
a350: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
a360: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
a370: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
a380: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
a390: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
a3a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
a3b0: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
a3c0: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
a3d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
a3e0: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
a3f0: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
a400: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
a410: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
a420: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
a430: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
a440: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
a450: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a460: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
a470: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
a480: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
a490: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
a4a0: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
a4b0: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
a4c0: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
a4d0: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
a4e0: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
a4f0: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
a500: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
a510: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
a520: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
a530: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
a540: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
a550: 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ",.  };.  const 
a560: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e  char *zErr = "un
a570: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
a580: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
a590: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
a5a0: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a  ORT_ROLLBACK: {.
a5b0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62        zErr = "ab
a5c0: 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42  ort due to ROLLB
a5d0: 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ACK";.      brea
a5e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
a5f0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
a600: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
a610: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
a620: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
a630: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
a640: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
a650: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
a660: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
a670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a680: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
a690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
a6a0: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
a6b0: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
a6c0: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
a6d0: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
a6e0: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
a6f0: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
a700: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
a710: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
a720: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
a730: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
a740: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
a750: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
a760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a770: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
a780: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64  yCallback(. void
a790: 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20   *ptr,          
a7a0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
a7b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
a7c0: 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20  int count       
a7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a7e0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c  er of times tabl
a7f0: 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20  e has been busy 
a800: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
a810: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69  _OS_WIN || (defi
a820: 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
a830: 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29   && HAVE_USLEEP)
a840: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a850: 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20  u8 delays[] =.  
a860: 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30     { 1, 2, 5, 10
a870: 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35  , 15, 20, 25, 25
a880: 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c  ,  25,  50,  50,
a890: 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63   100 };.  static
a8a0: 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73   const u8 totals
a8b0: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31  [] =.     { 0, 1
a8c0: 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c  , 3,  8, 18, 33,
a8d0: 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32   53, 78, 103, 12
a8e0: 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23  8, 178, 228 };.#
a8f0: 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41   define NDELAY A
a900: 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29  rraySize(delays)
a910: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a920: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
a930: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
a940: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
a950: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
a960: 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rior;..  assert(
a970: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
a980: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
a990: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
a9a0: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
a9b0: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
a9c0: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
a9d0: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
a9e0: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
a9f0: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
aa00: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
aa10: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
aa20: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
aa30: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
aa40: 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  ay > timeout ){.
aa50: 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65      delay = time
aa60: 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20  out - prior;.   
aa70: 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20   if( delay<=0 ) 
aa80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
aa90: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
aaa0: 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31  b->pVfs, delay*1
aab0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
aac0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
aad0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
aae0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
aaf0: 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65  meout = ((sqlite
ab00: 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69  3 *)ptr)->busyTi
ab10: 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f  meout;.  if( (co
ab20: 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69  unt+1)*1000 > ti
ab30: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  meout ){.    ret
ab40: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
ab50: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
ab60: 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a  pVfs, 1000000);.
ab70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
ab80: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  if.}../*.** Invo
ab90: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73  ke the given bus
aba0: 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  y handler..**.**
abb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
abc0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
abd0: 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  operation failed
abe0: 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a   with a lock..**
abf0: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
ac00: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
ac10: 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72  o, the lock is r
ac20: 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a  etried.  If it.*
ac30: 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65  * returns 0, the
ac40: 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74   operation abort
ac50: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
ac60: 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a  _BUSY error..*/.
ac70: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  int sqlite3Invok
ac80: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73  eBusyHandler(Bus
ac90: 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20  yHandler *p){.  
aca0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45  int rc;.  if( NE
acb0: 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e  VER(p==0) || p->
acc0: 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  xFunc==0 || p->n
acd0: 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20  Busy<0 ) return 
ace0: 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75  0;.  rc = p->xFu
acf0: 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e  nc(p->pArg, p->n
ad00: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d  Busy);.  if( rc=
ad10: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  =0 ){.    p->nBu
ad20: 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  sy = -1;.  }else
ad30: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b  {.    p->nBusy++
ad40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
ad50: 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c; .}../*.** Thi
ad60: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
ad70: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
ad80: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
ad90: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
ada0: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
adb0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
adc0: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
add0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
ade0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a  3_busy_handler(.
adf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
ae00: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
ae10: 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  id*,int),.  void
ae20: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69   *pArg.){.  sqli
ae30: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ae40: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
ae50: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46  ->busyHandler.xF
ae60: 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64  unc = xBusy;.  d
ae70: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70  b->busyHandler.p
ae80: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62  Arg = pArg;.  db
ae90: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
aea0: 75 73 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62  usy = 0;.  db->b
aeb0: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  usyTimeout = 0;.
aec0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aed0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
aee0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
aef0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
af00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
af10: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
af20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
af30: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
af40: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
af50: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
af60: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
af70: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
af80: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
af90: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
afa0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
afb0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
afc0: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
afd0: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
afe0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
aff0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
b000: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
b010: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
b020: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
b030: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
b040: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
b050: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
b060: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
b070: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
b080: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
b090: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
b0a0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75  ProgressOps = (u
b0b0: 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20  nsigned)nOps;.  
b0c0: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
b0d0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c  rg = pArg;.  }el
b0e0: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f  se{.    db->xPro
b0f0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64  gress = 0;.    d
b100: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
b110: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  = 0;.    db->pPr
b120: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
b130: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
b140: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
b150: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
b160: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b170: 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65  ne installs a de
b180: 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c  fault busy handl
b190: 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f  er that waits fo
b1a0: 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  r the.** specifi
b1b0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  ed number of mil
b1c0: 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
b1d0: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f   returning 0..*/
b1e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
b1f0: 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65  y_timeout(sqlite
b200: 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a  3 *db, int ms){.
b210: 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20    if( ms>0 ){.  
b220: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
b230: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
b240: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
b250: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
b260: 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  ;.    db->busyTi
b270: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65  meout = ms;.  }e
b280: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b290: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
b2a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
b2b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b2c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
b2d0: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
b2e0: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
b2f0: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
b300: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
b310: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
b320: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
b330: 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e  ){.  db->u1.isIn
b340: 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d  terrupted = 1;.}
b350: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
b360: 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c  nction is exactl
b370: 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  y the same as sq
b380: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
b390: 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a  ction(), except.
b3a0: 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64 65  ** that it is de
b3b0: 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c  signed to be cal
b3c0: 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20  led by internal 
b3d0: 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65 72  code. The differ
b3e0: 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20  ence is.** that 
b3f0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
b400: 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63  ils in sqlite3_c
b410: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
b420: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  , an error code.
b430: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
b440: 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69  nd the mallocFai
b450: 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64  led flag cleared
b460: 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
b470: 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73  3CreateFunc(.  s
b480: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
b490: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74  nst char *zFunct
b4a0: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
b4b0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
b4c0: 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74    void *pUserDat
b4d0: 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  a,.  void (*xFun
b4e0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
b4f0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
b500: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
b510: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
b520: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
b530: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
b540: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
b550: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
b560: 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73  ext*),.  FuncDes
b570: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
b580: 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65  ctor.){.  FuncDe
b590: 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  f *p;.  int nNam
b5a0: 65 3b 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c  e;.  int extraFl
b5b0: 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ags;..  assert( 
b5c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b5d0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
b5e0: 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e  .  if( zFunction
b5f0: 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  Name==0 ||.     
b600: 20 28 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e   (xFunc && (xFin
b610: 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c  al || xStep)) ||
b620: 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20   .      (!xFunc 
b630: 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78  && (xFinal && !x
b640: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
b650: 28 21 78 46 75 6e 63 20 26 26 20 28 21 78 46 69  (!xFunc && (!xFi
b660: 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c  nal && xStep)) |
b670: 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31  |.      (nArg<-1
b680: 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f   || nArg>SQLITE_
b690: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
b6a0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c  ) ||.      (255<
b6b0: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
b6c0: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
b6d0: 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20  ionName))) ){.  
b6e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b6f0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
b700: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
b710: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
b720: 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  ==SQLITE_DETERMI
b730: 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72  NISTIC );.  extr
b740: 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20  aFlags = enc &  
b750: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
b760: 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28  STIC;.  enc &= (
b770: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
b780: 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b  ASK|SQLITE_ANY);
b790: 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .  .#ifndef SQLI
b7a0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
b7b0: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
b7c0: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
b7d0: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
b7e0: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
b7f0: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
b800: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
b810: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
b820: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
b830: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
b840: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
b850: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
b860: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
b870: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
b880: 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70  SQLITE_ANY is sp
b890: 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72  ecified, add thr
b8a0: 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
b8b0: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  he function.  **
b8c0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
b8d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
b8e0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
b8f0: 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51   ){.    enc = SQ
b900: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
b910: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e  ;.  }else if( en
b920: 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b  c==SQLITE_ANY ){
b930: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
b940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
b950: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
b960: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
b970: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74   SQLITE_UTF8|ext
b980: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
b990: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
b9a0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
b9b0: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
b9c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b9d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b9e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
b9f0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
ba00: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
ba10: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65  SQLITE_UTF16LE|e
ba20: 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20  xtraFlags,.     
ba30: 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20       pUserData, 
ba40: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
ba50: 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f  inal, pDestructo
ba60: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
ba70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ba80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ba90: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e  rc;.    }.    en
baa0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
bab0: 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  BE;.  }.#else.  
bac0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
bad0: 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f  8;.#endif.  .  /
bae0: 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78  * Check if an ex
baf0: 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  isting function 
bb00: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
bb10: 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  den or deleted. 
bb20: 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20  If so,.  ** and 
bb30: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
bb40: 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72   VMs, then retur
bb50: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49  n SQLITE_BUSY. I
bb60: 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  f a function.  *
bb70: 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  * is being overr
bb80: 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75  idden/deleted bu
bb90: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  t there are no a
bba0: 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77  ctive VMs, allow
bbb0: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
bbc0: 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ion to continue 
bbd0: 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61  but invalidate a
bbe0: 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73  ll precompiled s
bbf0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
bc00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
bc10: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
bc20: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61  unctionName, nNa
bc30: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
bc40: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  c, 0);.  if( p &
bc50: 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  & (p->funcFlags 
bc60: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
bc70: 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70  CMASK)==enc && p
bc80: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a  ->nArg==nArg ){.
bc90: 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62      if( db->nVdb
bca0: 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  eActive ){.     
bcb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
bcc0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
bcd0: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
bce0: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
bcf0: 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64   user-function d
bd00: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
bd10: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
bd20: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
bd30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
bd40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bd50: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
bd60: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
bd70: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
bd80: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
bd90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
bda0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
bdb0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
bdc0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
bdd0: 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a  g, (u8)enc, 1);.
bde0: 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62    assert(p || db
bdf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b  ->mallocFailed);
be00: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
be10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
be20: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
be30: 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73  If an older vers
be40: 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ion of the funct
be50: 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69  ion with a confi
be60: 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72  gured destructor
be70: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72   is.  ** being r
be80: 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74  eplaced invoke t
be90: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
bea0: 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a  nction here. */.
beb0: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
bec0: 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28  y(db, p);..  if(
bed0: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
bee0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
bef0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
bf00: 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->pDestructor = 
bf10: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
bf20: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
bf30: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
bf40: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
bf50: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
bf60: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
bf70: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
bf80: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
bf90: 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   );.  p->xFunc =
bfa0: 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74   xFunc;.  p->xSt
bfb0: 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d  ep = xStep;.  p-
bfc0: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
bfd0: 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  nal;.  p->pUserD
bfe0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
bff0: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
c000: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
c010: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c020: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
c030: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
c040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
c050: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
c060: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
c070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
c080: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
c090: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
c0a0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
c0b0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
c0c0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c0d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
c0e0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
c0f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c100: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c110: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
c120: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
c130: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
c140: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
c150: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
c160: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
c170: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
c180: 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20  xStep,.         
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61             xFina
c1b0: 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  l, 0);.}..int sq
c1c0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
c1d0: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ction_v2(.  sqli
c1e0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
c1f0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
c200: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
c210: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
c220: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
c230: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
c240: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
c250: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
c260: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
c270: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
c280: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
c290: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
c2a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c2b0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
c2c0: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
c2d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c2e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
c2f0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
c300: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
c310: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
c320: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78  >mutex);.  if( x
c330: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70  Destroy ){.    p
c340: 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72  Arg = (FuncDestr
c350: 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44  uctor *)sqlite3D
c360: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
c370: 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72  sizeof(FuncDestr
c380: 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28  uctor));.    if(
c390: 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20   !pArg ){.      
c3a0: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
c3b0: 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20     goto out;.   
c3c0: 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65   }.    pArg->xDe
c3d0: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
c3e0: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
c3f0: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
c400: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
c410: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
c420: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
c430: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
c440: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
c450: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
c460: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
c470: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
c480: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
c490: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
c4a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c4b0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
c4c0: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
c4d0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
c4e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
c4f0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
c500: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
c510: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c520: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
c530: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
c540: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
c550: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
c560: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
c570: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
c580: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
c590: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
c5a0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
c5b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
c5c0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
c5d0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
c5e0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
c5f0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
c600: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
c610: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
c620: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
c630: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
c640: 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20  char *zFunc8;.  
c650: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
c660: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
c670: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
c680: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
c690: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
c6a0: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
c6b0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
c6c0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
c6d0: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
c6e0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
c6f0: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
c700: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
c710: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
c720: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
c730: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
c740: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
c750: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
c760: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
c770: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
c780: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
c790: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
c7a0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
c7b0: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
c7c0: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
c7d0: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
c7e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
c7f0: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
c800: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
c810: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
c820: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
c830: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
c840: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
c850: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
c860: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
c870: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
c880: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
c890: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
c8a0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
c8b0: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
c8c0: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
c8d0: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
c8e0: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
c8f0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
c900: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
c910: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
c920: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
c930: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
c940: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
c950: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
c960: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
c970: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
c980: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
c990: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
c9a0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
c9b0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
c9c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
c9d0: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
c9e0: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
c9f0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ca00: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ca10: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
ca20: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ca30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
ca40: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
ca50: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
ca60: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
ca70: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
ca80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
ca90: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
caa0: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
cab0: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
cae0: 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c  InvalidFunction,
caf0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
cb00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
cb10: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
cb20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
cb30: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
cb40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cb50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cb60: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
cb70: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
cb80: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
cb90: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
cba0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
cbb0: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
cbc0: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
cbd0: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
cbe0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
cbf0: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
cc00: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
cc10: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
cc20: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
cc30: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
cc40: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
cc50: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
cc60: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
cc70: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
cc80: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
cc90: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
cca0: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
ccb0: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
ccc0: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
ccd0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
cce0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ccf0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
cd00: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
cd10: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
cd20: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
cd30: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
cd40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
cd50: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
cd60: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
cd70: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
cd80: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
cd90: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
cda0: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
cdb0: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
cdc0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
cdd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
cde0: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
cdf0: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
ce00: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
ce10: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
ce20: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
ce30: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
ce40: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
ce50: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
ce60: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
ce70: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
ce80: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
ce90: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
cea0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
ceb0: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
cec0: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
ced0: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
cee0: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
cef0: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
cf00: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
cf10: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
cf20: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
cf30: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
cf40: 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
cf50: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
cf60: 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
cf70: 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
cf80: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
cf90: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
cfa0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
cfb0: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
cfc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cfd0: 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  IT_TRACE */../*.
cfe0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
cff0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
d000: 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
d010: 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e  saction commits.
d020: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b  .** If the invok
d030: 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ed function retu
d040: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
d050: 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65  en the commit be
d060: 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62  comes a.** rollb
d070: 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ack..*/.void *sq
d080: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
d090: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
d0a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d0b0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
d0c0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
d0d0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  se */.  int (*xC
d0e0: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
d0f0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
d100: 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20   invoke on each 
d110: 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64  commit */.  void
d120: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
d130: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
d140: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
d150: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
d160: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
d170: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
d180: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
d190: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b   db->pCommitArg;
d1a0: 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  .  db->xCommitCa
d1b0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d1c0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69  ck;.  db->pCommi
d1d0: 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  tArg = pArg;.  s
d1e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d1f0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d200: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
d210: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d220: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
d230: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
d240: 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  me a row is upda
d250: 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ted,.** inserted
d260: 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e   or deleted usin
d270: 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
d280: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
d290: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64  oid *sqlite3_upd
d2a0: 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
d2b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d2c0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
d2d0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
d2e0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
d2f0: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
d300: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20  (void*,int,char 
d310: 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e  const *,char con
d320: 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36  st *,sqlite_int6
d330: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
d360: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
d370: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
d380: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d390: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d3a0: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
d3b0: 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
d3c0: 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
d3d0: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
d3e0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d  db->pUpdateArg =
d3f0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
d400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
d410: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
d420: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
d430: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
d440: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
d450: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
d460: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
d470: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20  lled.** back by 
d480: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
d490: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
d4a0: 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  d *sqlite3_rollb
d4b0: 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ack_hook(.  sqli
d4c0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d4d0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
d4e0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
d4f0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
d500: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
d510: 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c  (void*), /* Call
d520: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
d530: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d550: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
d560: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
d570: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
d580: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d590: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
d5a0: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
d5b0: 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
d5c0: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
d5d0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
d5e0: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
d5f0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
d600: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d610: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
d620: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
d630: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d640: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
d650: 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  K./*.** Register
d660: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
d670: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
d680: 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64  ime a row is upd
d690: 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65  ated,.** inserte
d6a0: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69  d or deleted usi
d6b0: 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ng this database
d6c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
d6d0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
d6e0: 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  eupdate_hook(.  
d6f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
d700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
d710: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
d720: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
d730: 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61  .  void(*xCallba
d740: 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f 2a 20  ck)(         /* 
d750: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
d760: 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73  n */.    void*,s
d770: 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72  qlite3*,int,char
d780: 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e   const*,char con
d790: 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  st*,sqlite3_int6
d7a0: 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  4,sqlite3_int64)
d7b0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d7d0: 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20   First callback 
d7e0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
d7f0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
d800: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d810: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
d820: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50 72 65   pRet = db->pPre
d830: 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
d840: 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
d850: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
d860: 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
d870: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
d880: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d890: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d8a0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
d8b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d8c0: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
d8d0: 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64  E_HOOK */..#ifnd
d8e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
d8f0: 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  AL./*.** The sql
d900: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
d910: 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
d920: 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  red by sqlite3_w
d930: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
d940: 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73  t()..** Invoke s
d950: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
d960: 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d  point if the num
d970: 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e  ber of frames in
d980: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a   the log file.**
d990: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
d9a0: 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67   sqlite3.pWalArg
d9b0: 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65   cast to an inte
d9c0: 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63  ger (the value c
d9d0: 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20  onfigured by.** 
d9e0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
d9f0: 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73  nt())..*/ .int s
da00: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
da10: 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43  Hook(.  void *pC
da20: 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f  lientData,     /
da30: 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20  * Argument */.  
da40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
da50: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
da60: 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
da70: 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
da80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a   /* Database */.
da90: 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20    int nFrame    
daa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
dab0: 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20   of WAL */.){.  
dac0: 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49  if( nFrame>=SQLI
dad0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43  TE_PTR_TO_INT(pC
dae0: 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20  lientData) ){.  
daf0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
db00: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
db10: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
db20: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62  eckpoint(db, zDb
db30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
db40: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
db50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
db60: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
db70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
db80: 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
db90: 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69  onfigure an sqli
dba0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
dbb0: 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d  allback to autom
dbc0: 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f  atically checkpo
dbd0: 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  int.** a databas
dbe0: 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69  e after committi
dbf0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
dc00: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46   if there are nF
dc10: 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20  rame or.** more 
dc20: 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
dc30: 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20  g file. Passing 
dc40: 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69  zero or a negati
dc50: 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  ve value as the.
dc60: 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65  ** nFrame parame
dc70: 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74  ter disables aut
dc80: 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e  omatic checkpoin
dc90: 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a  ts entirely..**.
dca0: 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
dcb0: 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68  registered by th
dcc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c  is function repl
dcd0: 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e  aces any existin
dce0: 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65  g callback.** re
dcf0: 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73  gistered using s
dd00: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
dd10: 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67  ). Likewise, reg
dd20: 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62  istering a callb
dd30: 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ack.** using sql
dd40: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
dd50: 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74  disables the aut
dd60: 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e  omatic checkpoin
dd70: 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63  t mechanism.** c
dd80: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69  onfigured by thi
dd90: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
dda0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  nt sqlite3_wal_a
ddb0: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  utocheckpoint(sq
ddc0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
ddd0: 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53  Frame){.#ifdef S
dde0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
ddf0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
de00: 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
de10: 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65  PARAMETER(nFrame
de20: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e  );.#else.  if( n
de30: 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73  Frame>0 ){.    s
de40: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
de50: 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65  db, sqlite3WalDe
de60: 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54  faultHook, SQLIT
de70: 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72  E_INT_TO_PTR(nFr
de80: 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ame));.  }else{.
de90: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
dea0: 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a  hook(db, 0, 0);.
deb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
dec0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ded0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
dee0: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
def0: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
df00: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
df10: 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  n is written.** 
df20: 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61  into the write-a
df30: 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73  head-log by this
df40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
df50: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
df60: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
df70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
dfa0: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62   hook to this db
dfb0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
dfc0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
dfd0: 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  d *, sqlite3*, c
dfe0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
dff0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e010: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
e020: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
e030: 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29  xCallback() */.)
e040: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
e050: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64  _OMIT_WAL.  void
e060: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
e070: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e080: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
e090: 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a   = db->pWalArg;.
e0a0: 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61    db->xWalCallba
e0b0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
e0c0: 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20    db->pWalArg = 
e0d0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
e0e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e0f0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e100: 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72   pRet;.#else.  r
e110: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
e120: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  }../*.** Checkpo
e130: 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
e140: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e150: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
e160: 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  v2(.  sqlite3 *d
e170: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
e180: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
e190: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
e1a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1c0: 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65   Name of attache
e1d0: 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e  d database (or N
e1e0: 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d  ULL) */.  int eM
e1f0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
e200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
e210: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a  ITE_CHECKPOINT_*
e220: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
e230: 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20  *pnLog,         
e240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e250: 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20  UT: Size of WAL 
e260: 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f  log in frames */
e270: 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20  .  int *pnCkpt  
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c     /* OUT: Total
e2a0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
e2b0: 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a  s checkpointed *
e2c0: 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  /.){.#ifdef SQLI
e2d0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65  TE_OMIT_WAL.  re
e2e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e2f0: 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20  #else.  int rc; 
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
e320: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
e330: 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  iDb = SQLITE_MAX
e340: 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73  _ATTACHED;  /* s
e350: 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64  qlite3.aDb[] ind
e360: 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63  ex of db to chec
e370: 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  kpoint */..  /* 
e380: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
e390: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
e3a0: 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e  to -1 in case an
e3b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
e3c0: 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20  /.  if( pnLog ) 
e3d0: 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69  *pnLog = -1;.  i
e3e0: 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43  f( pnCkpt ) *pnC
e3f0: 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73  kpt = -1;..  ass
e400: 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
e410: 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c 49  KPOINT_FULL>SQLI
e420: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
e430: 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  SSIVE );.  asser
e440: 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
e450: 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54 45  OINT_FULL<SQLITE
e460: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
e470: 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ART );.  assert(
e480: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
e490: 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53 51  NT_PASSIVE+2==SQ
e4a0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
e4b0: 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66 28  RESTART );.  if(
e4c0: 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48   eMode<SQLITE_CH
e4d0: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
e4e0: 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45   || eMode>SQLITE
e4f0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
e500: 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ART ){.    retur
e510: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
e520: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
e530: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e540: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44  mutex);.  if( zD
e550: 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20  b && zDb[0] ){. 
e560: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
e570: 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
e580: 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  Db);.  }.  if( i
e590: 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  Db<0 ){.    rc =
e5a0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e5b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
e5c0: 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  db, SQLITE_ERROR
e5d0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
e5e0: 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a  ase: %s", zDb);.
e5f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
e600: 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  = sqlite3Checkpo
e610: 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f  int(db, iDb, eMo
e620: 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
e630: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
e640: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
e650: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
e660: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
e670: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
e680: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
e690: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
e6a0: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
e6b0: 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
e6c0: 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20  atabase zDb. If 
e6d0: 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  zDb is NULL, or 
e6e0: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 44  if the buffer zD
e6f0: 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63  b points.** to c
e700: 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c  ontains a zero-l
e710: 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c  ength string, al
e720: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
e730: 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65  ases are .** che
e740: 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e  ckpointed..*/.in
e750: 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
e760: 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
e770: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
e780: 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72 6e   *zDb){.  return
e790: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
e7a0: 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a  ckpoint_v2(db, z
e7b0: 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  Db, SQLITE_CHECK
e7c0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 30  POINT_PASSIVE, 0
e7d0: 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , 0);.}..#ifndef
e7e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
e7f0: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65  ./*.** Run a che
e800: 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62  ckpoint on datab
e810: 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73  ase iDb. This is
e820: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61   a no-op if data
e830: 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e  base iDb is.** n
e840: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ot currently ope
e850: 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a  n in WAL mode..*
e860: 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
e870: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
e880: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
e890: 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
e8a0: 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
e8b0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
e8c0: 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20  TE_LOCKED and a 
e8d0: 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f  checkpoint is no
e8e0: 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20  t attempted. If 
e8f0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  .** an error occ
e900: 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e  urs while runnin
e910: 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  g the checkpoint
e920: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
e930: 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
e940: 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c  turned (i.e. SQL
e950: 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65  ITE_IOERR). Othe
e960: 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
e970: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
e980: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  x on database ha
e990: 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62  ndle db should b
e9a0: 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61  e held by the ca
e9b0: 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a  ller. The mutex.
e9c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
e9d0: 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20  th the specific 
e9e0: 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65  b-tree being che
e9f0: 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b  ckpointed is tak
ea00: 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75  en by.** this fu
ea10: 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65  nction while the
ea20: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72   checkpoint is r
ea30: 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  unning..**.** If
ea40: 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53   iDb is passed S
ea50: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
ea60: 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74  ED, then all att
ea70: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
ea80: 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  are.** checkpoin
ea90: 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ted. If an error
eaa0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
eab0: 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  it is returned i
eac0: 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20  mmediately -.** 
ead0: 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  no attempt is ma
eae0: 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  de to checkpoint
eaf0: 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64   any remaining d
eb00: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
eb10: 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
eb20: 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  is one of SQLITE
eb30: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
eb40: 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53  IVE, FULL or RES
eb50: 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TART..*/.int sql
eb60: 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73  ite3Checkpoint(s
eb70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
eb80: 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20  iDb, int eMode, 
eb90: 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20  int *pnLog, int 
eba0: 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20  *pnCkpt){.  int 
ebb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ebd0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ebe0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
ec10: 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61 63  te through attac
ec20: 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74  hed dbs */.  int
ec30: 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20   bBusy = 0;     
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec50: 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42  True if SQLITE_B
ec60: 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63  USY has been enc
ec70: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61  ountered */..  a
ec80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ec90: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
eca0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
ecb0: 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c  ( !pnLog || *pnL
ecc0: 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65  og==-1 );.  asse
ecd0: 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a  rt( !pnCkpt || *
ece0: 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20  pnCkpt==-1 );.. 
ecf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
ed00: 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  nDb && rc==SQLIT
ed10: 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
ed20: 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44  if( i==iDb || iD
ed30: 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  b==SQLITE_MAX_AT
ed40: 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20  TACHED ){.      
ed50: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
ed60: 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e  eCheckpoint(db->
ed70: 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64  aDb[i].pBt, eMod
ed80: 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74  e, pnLog, pnCkpt
ed90: 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d  );.      pnLog =
eda0: 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74   0;.      pnCkpt
edb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
edc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
edd0: 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73 79  ){.        bBusy
ede0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63   = 1;.        rc
edf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ee00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ee10: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
ee20: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73  QLITE_OK && bBus
ee30: 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
ee40: 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20   : rc;.}.#endif 
ee50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
ee60: 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  AL */../*.** Thi
ee70: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
ee80: 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d  ns true if main-
ee90: 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  memory should be
eea0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
eeb0: 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
eec0: 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65  file for transie
eed0: 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61  nt pager files a
eee0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  nd statement jou
eef0: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61  rnals..** The va
ef00: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70  lue returned dep
ef10: 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
ef20: 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74  e of db->temp_st
ef30: 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20  ore (runtime.** 
ef40: 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74  parameter) and t
ef50: 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  he compile time 
ef60: 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f  value of SQLITE_
ef70: 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a  TEMP_STORE. The.
ef80: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  ** following tab
ef90: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
efa0: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
efb0: 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20  tween these two 
efc0: 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68  values.** and th
efd0: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  is functions ret
efe0: 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  urn value..**.**
eff0: 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53     SQLITE_TEMP_S
f000: 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d  TORE     db->tem
f010: 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61  p_store     Loca
f020: 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72  tion of temporar
f030: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  y database.**   
f040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f050: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
f060: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
f070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f080: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
f0b0: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
f0c0: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
f0d0: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
f0e0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
f0f0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
f100: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
f110: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
f120: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
f130: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
f140: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
f150: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
f160: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
f180: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
f190: 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
f1d0: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
f200: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
f210: 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32  return 1).**   2
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
f240: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
f250: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
f260: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
f270: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
f280: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
f290: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
f2a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65  */.int sqlite3Te
f2b0: 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74  mpInMemory(const
f2c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23   sqlite3 *db){.#
f2d0: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
f2e0: 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e  TORE==1.  return
f2f0: 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
f300: 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e==2 );.#endif.#
f310: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
f320: 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e  TORE==2.  return
f330: 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
f340: 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e!=1 );.#endif.#
f350: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
f360: 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e  TORE==3.  return
f370: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   1;.#endif.#if S
f380: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
f390: 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d  <1 || SQLITE_TEM
f3a0: 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75  P_STORE>3.  retu
f3b0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
f3c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
f3d0: 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  -8 encoded Engli
f3e0: 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
f3f0: 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
f400: 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
f410: 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ror..*/.const ch
f420: 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  ar *sqlite3_errm
f430: 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sg(sqlite3 *db){
f440: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f450: 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
f460: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
f470: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
f480: 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  OMEM);.  }.  if(
f490: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f4a0: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
f4b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
f4c0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
f4d0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29  ITE_MISUSE_BKPT)
f4e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
f4f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f500: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
f510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f520: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
f530: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
f540: 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OMEM);.  }else{.
f550: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
f560: 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20  ->pErr==0 );.   
f570: 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69   z = (char*)sqli
f580: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
f590: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73  b->pErr);.    as
f5a0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
f5b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
f5c0: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
f5d0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
f5e0: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b  tr(db->errCode);
f5f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
f600: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f610: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f620: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
f630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f640: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
f650: 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
f660: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
f670: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
f680: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
f690: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
f6a0: 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
f6b0: 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
f6c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
f6d0: 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74  ic const u16 out
f6e0: 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20  OfMem[] = {.    
f6f0: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
f700: 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20   ', 'o', 'f', ' 
f710: 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27  ', 'm', 'e', 'm'
f720: 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'o', 'r', 'y',
f730: 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63   0.  };.  static
f740: 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73   const u16 misus
f750: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c  e[] = {.    'l',
f760: 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20   'i', 'b', 'r', 
f770: 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27  'a', 'r', 'y', '
f780: 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f   ', .    'r', 'o
f790: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27  ', 'u', 't', 'i'
f7a0: 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c  , 'n', 'e', ' ',
f7b0: 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20   .    'c', 'a', 
f7c0: 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27  'l', 'l', 'e', '
f7d0: 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  d', ' ', .    'o
f7e0: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
f7f0: 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c  , .    'o', 'f',
f800: 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20   ' ', .    's', 
f810: 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27  'e', 'q', 'u', '
f820: 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65  e', 'n', 'c', 'e
f830: 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e  ', 0.  };..  con
f840: 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66  st void *z;.  if
f850: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
f860: 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  urn (void *)outO
f870: 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fMem;.  }.  if( 
f880: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f890: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
f8a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
f8b0: 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20  oid *)misuse;.  
f8c0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
f8d0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f8e0: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
f8f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f900: 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75    z = (void *)ou
f910: 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b  tOfMem;.  }else{
f920: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
f930: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
f940: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28  ->pErr);.    if(
f950: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   z==0 ){.      s
f960: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
f970: 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c  db->errCode, sql
f980: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
f990: 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  rrCode));.      
f9a0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
f9b0: 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
f9c0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
f9d0: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
f9e0: 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
f9f0: 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
fa00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
fa10: 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
fa20: 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
fa30: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
fa40: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
fa50: 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
fa60: 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
fa70: 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
fa80: 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
fa90: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
faa0: 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
fab0: 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
fac0: 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
fad0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
fae0: 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
faf0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62  e..    */.    db
fb00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
fb10: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
fb20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
fb30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
fb40: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
fb50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
fb60: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
fb70: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
fb80: 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
fb90: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
fba0: 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20  SQLite routine. 
fbb0: 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61  If NULL is.** pa
fbc0: 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
fbd0: 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65  ction, we assume
fbe0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
fbf0: 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  ed during sqlite
fc00: 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  3_open()..*/.int
fc10: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
fc20: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
fc30: 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
fc40: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
fc50: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
fc60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fc70: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
fc80: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
fc90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fcb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
fcc0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
fcd0: 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
fce0: 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  k;.}.int sqlite3
fcf0: 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
fd00: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
fd10: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
fd20: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
fd30: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
fd40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fd50: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
fd60: 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
fd70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
fd80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fd90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
fda0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
fdb0: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Code;.}../*.** R
fdc0: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
fdd0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
fde0: 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
fdf0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
fe00: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46  .** argument.  F
fe10: 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d  or now, this sim
fe20: 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e  ply calls the in
fe30: 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72  ternal sqlite3Er
fe40: 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rStr().** functi
fe50: 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
fe60: 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74  r *sqlite3_errst
fe70: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74  r(int rc){.  ret
fe80: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
fe90: 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r(rc);.}../*.** 
fea0: 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  Invalidate all c
feb0: 61 63 68 65 64 20 4b 65 79 49 6e 66 6f 20 6f 62  ached KeyInfo ob
fec0: 6a 65 63 74 73 20 66 6f 72 20 64 61 74 61 62 61  jects for databa
fed0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  se connection "d
fee0: 62 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b".*/.static voi
fef0: 64 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63 68  d invalidateCach
ff00: 65 64 4b 65 79 49 6e 66 6f 28 73 71 6c 69 74 65  edKeyInfo(sqlite
ff10: 33 20 2a 64 62 29 7b 0a 20 20 44 62 20 2a 70 44  3 *db){.  Db *pD
ff20: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
ff30: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
ff40: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
ff50: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ff70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
ff80: 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 48 61  x number */.  Ha
ff90: 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
ffa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
ffb0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
ffc0: 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
ffd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fff0: 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
10000 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
10010 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
10020 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68           /* Each
10030 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 66 6f 72   index */..  for
10040 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
10050 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
10060 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
10070 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
10080 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
10090 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
100a0 65 45 6e 74 65 72 28 70 44 62 2d 3e 70 42 74 29  eEnter(pDb->pBt)
100b0 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
100c0 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
100d0 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
100e0 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
100f0 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
10100 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
10110 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
10120 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72  ta(k);.      for
10130 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
10140 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
10150 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
10160 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70       if( pIdx->p
10170 4b 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d  KeyInfo && pIdx-
10180 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64  >pKeyInfo->db==d
10190 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  b ){.          s
101a0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
101b0 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66  ef(pIdx->pKeyInf
101c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  o);.          pI
101d0 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 30  dx->pKeyInfo = 0
101e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
101f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
10200 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10210 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 7d  pDb->pBt);.  }.}
10220 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
10230 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
10240 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
10250 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
10260 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
10270 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
10280 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
10290 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
102a0 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
102b0 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
102c0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
102d0 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20  u8 enc,.  void* 
102e0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
102f0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
10300 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
10310 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
10320 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
10330 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
10340 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
10350 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  nc2;.  int nName
10360 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
10370 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20  30(zName);.  .  
10380 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10390 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
103a0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
103b0 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
103c0 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
103d0 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
103e0 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
103f0 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
10400 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
10410 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
10420 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
10430 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
10440 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
10450 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
10460 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
10470 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63   */.  enc2 = enc
10480 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
10490 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
104a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
104b0 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
104c0 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20  16_ALIGNED );.  
104d0 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  if( enc2==SQLITE
104e0 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d  _UTF16 || enc2==
104f0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
10500 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32  GNED ){.    enc2
10510 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
10520 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28  ATIVE;.  }.  if(
10530 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46   enc2<SQLITE_UTF
10540 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45  8 || enc2>SQLITE
10550 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20  _UTF16BE ){.    
10560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
10570 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
10580 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
10590 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
105a0 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
105b0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
105c0 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
105d0 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
105e0 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
105f0 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
10600 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
10610 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
10620 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
10630 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
10640 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
10650 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  */.  pColl = sql
10660 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
10670 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
10680 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ame, 0);.  if( p
10690 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
106a0 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Cmp ){.    if( d
106b0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
106c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
106d0 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
106e0 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
106f0 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
10700 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
10710 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
10720 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
10730 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
10740 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
10750 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10760 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
10770 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
10780 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 61      invalidateCa
10790 63 68 65 64 4b 65 79 49 6e 66 6f 28 64 62 29 3b  chedKeyInfo(db);
107a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c  ..    /* If coll
107b0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
107c0 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64  Coll was created
107d0 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63   directly by a c
107e0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
107f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
10800 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20  lation, and not 
10810 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e  generated by syn
10820 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20  thCollSeq(),.   
10830 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70   ** then any cop
10840 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74  ies made by synt
10850 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20  hCollSeq() need 
10860 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
10870 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  d..    ** Also, 
10880 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75  collation destru
10890 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78  ctor - CollSeq.x
108a0 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e  Del() - function
108b0 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
108c0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20   to be called.. 
108d0 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28     */ .    if( (
108e0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51  pColl->enc & ~SQ
108f0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
10900 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20  ED)==enc2 ){.   
10910 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c     CollSeq *aCol
10920 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
10930 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
10940 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  q, zName, nName)
10950 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
10960 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
10970 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  3; j++){.       
10980 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61   CollSeq *p = &a
10990 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
109a0 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f   if( p->enc==pCo
109b0 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20  ll->enc ){.     
109c0 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c       if( p->xDel
109d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
109e0 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72  p->xDel(p->pUser
109f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
10a00 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70           p->xCmp
10a10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
10a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10a30 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  }..  pColl = sql
10a40 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
10a50 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
10a60 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ame, 1);.  if( p
10a70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Coll==0 ) return
10a80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10a90 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78   pColl->xCmp = x
10aa0 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c  Compare;.  pColl
10ab0 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a  ->pUser = pCtx;.
10ac0 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20    pColl->xDel = 
10ad0 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65  xDel;.  pColl->e
10ae0 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c  nc = (u8)(enc2 |
10af0 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55   (enc & SQLITE_U
10b00 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a  TF16_ALIGNED));.
10b10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
10b20 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
10b30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10b40 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
10b50 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
10b60 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
10b70 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
10b80 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
10b90 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
10ba0 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
10bb0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
10bc0 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
10bd0 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
10be0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
10bf0 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
10c00 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
10c10 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
10c20 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10c30 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
10c40 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
10c50 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
10c60 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
10c70 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
10c80 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
10c90 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
10ca0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
10cb0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
10cc0 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
10cd0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
10ce0 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
10cf0 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
10d00 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54 45  NUMBER,.  SQLITE
10d10 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
10d20 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  TH,.};../*.** Ma
10d30 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64  ke sure the hard
10d40 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20   limits are set 
10d50 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61  to reasonable va
10d60 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lues.*/.#if SQLI
10d70 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30  TE_MAX_LENGTH<10
10d80 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
10d90 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _MAX_LENGTH must
10da0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
10db0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10dc0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10dd0 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
10de0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
10df0 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
10e00 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
10e10 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
10e20 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45  QL_LENGTH>SQLITE
10e30 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72  _MAX_LENGTH.# er
10e40 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
10e50 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e  QL_LENGTH must n
10e60 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ot be greater th
10e70 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  an SQLITE_MAX_LE
10e80 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20  NGTH.#endif.#if 
10e90 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
10ea0 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65  UND_SELECT<2.# e
10eb0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10ec0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
10ed0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
10ee0 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   2.#endif.#if SQ
10ef0 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
10f00 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  <40.# error SQLI
10f10 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d  TE_MAX_VDBE_OP m
10f20 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
10f30 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  40.#endif.#if SQ
10f40 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
10f50 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54  N_ARG<0 || SQLIT
10f60 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
10f70 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20  RG>1000.# error 
10f80 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10f90 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20  ION_ARG must be 
10fa0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30  between 0 and 10
10fb0 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
10fc0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10fd0 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  D<0 || SQLITE_MA
10fe0 58 5f 41 54 54 41 43 48 45 44 3e 36 32 0a 23 20  X_ATTACHED>62.# 
10ff0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
11000 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62  _ATTACHED must b
11010 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
11020 36 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  62.#endif.#if SQ
11030 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
11040 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
11050 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
11060 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
11070 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
11080 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
11090 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
110a0 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
110b0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
110c0 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
110d0 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
110e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
110f0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c  X_TRIGGER_DEPTH<
11100 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
11110 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
11120 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
11130 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ast 1.#endif.../
11140 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
11150 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74  value of a limit
11160 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c  .  Report the ol
11170 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61  d value..** If a
11180 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20  n invalid limit 
11190 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65  index is supplie
111a0 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a  d, report -1..**
111b0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
111c0 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72   but still repor
111d0 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  t the old value 
111e0 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69  if the.** new li
111f0 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
11200 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77  .**.** A new low
11210 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f  er limit does no
11220 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e  t shrink existin
11230 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a  g constructs..**
11240 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65   It merely preve
11250 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63  nts new construc
11260 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74  ts that exceed t
11270 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d  he limit.** from
11280 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   forming..*/.int
11290 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73   sqlite3_limit(s
112a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
112b0 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77  limitId, int new
112c0 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c  Limit){.  int ol
112d0 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45  dLimit;...  /* E
112e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
112f0 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61  189-54097 For ea
11300 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72  ch limit categor
11310 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e  y SQLITE_LIMIT_N
11320 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  AME.  ** there i
11330 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62  s a hard upper b
11340 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70  ound set at comp
11350 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20  ile-time by a C 
11360 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a  preprocessor.  *
11370 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53  * macro called S
11380 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20  QLITE_MAX_NAME. 
11390 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69  (The "_LIMIT_" i
113a0 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68  n the name is ch
113b0 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f  anged to.  ** "_
113c0 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61  MAX_".).  */.  a
113d0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
113e0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
113f0 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
11400 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  AX_LENGTH );.  a
11410 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11420 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53  t[SQLITE_LIMIT_S
11430 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49  QL_LENGTH]==SQLI
11440 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
11450 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
11460 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11470 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d  _LIMIT_COLUMN]==
11480 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
11490 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  N );.  assert( a
114a0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
114b0 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
114c0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45  H]==SQLITE_MAX_E
114d0 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  XPR_DEPTH );.  a
114e0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
114f0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
11500 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d  OMPOUND_SELECT]=
11510 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50  =SQLITE_MAX_COMP
11520 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20  OUND_SELECT);.  
11530 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11540 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11550 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45  VDBE_OP]==SQLITE
11560 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a  _MAX_VDBE_OP );.
11570 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
11580 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
11590 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d  T_FUNCTION_ARG]=
115a0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  =SQLITE_MAX_FUNC
115b0 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73  TION_ARG );.  as
115c0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
115d0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54  [SQLITE_LIMIT_AT
115e0 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f  TACHED]==SQLITE_
115f0 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a  MAX_ATTACHED );.
11600 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
11610 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
11620 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
11630 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20  ENGTH]==.       
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11660 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d          SQLITE_M
11670 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
11680 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
11690 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
116a0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
116b0 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51  ABLE_NUMBER]==SQ
116c0 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
116d0 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73  E_NUMBER);.  ass
116e0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
116f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
11700 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  GGER_DEPTH]==SQL
11710 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
11720 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
11730 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  t( SQLITE_LIMIT_
11740 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d 28  TRIGGER_DEPTH==(
11750 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31  SQLITE_N_LIMIT-1
11760 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d  ) );...  if( lim
11770 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49  itId<0 || limitI
11780 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  d>=SQLITE_N_LIMI
11790 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
117a0 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d  -1;.  }.  oldLim
117b0 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  it = db->aLimit[
117c0 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20  limitId];.  if( 
117d0 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20  newLimit>=0 ){  
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36   /* IMP: R-52476
11800 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66  -28732 */.    if
11810 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
11820 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
11830 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
11840 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
11850 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a  mitId];  /* IMP:
11860 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a   R-51463-25634 *
11870 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  /.    }.    db->
11880 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
11890 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
118a0 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
118b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
118c0 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
118d0 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a  -53341-35419 */.
118e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
118f0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
11900 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49  o parse both URI
11910 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69  s and non-URI fi
11920 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62  lenames passed b
11930 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f  y the.** user to
11940 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73   API functions s
11950 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72  qlite3_open() or
11960 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
11970 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61  (), and for data
11980 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65  base.** URIs spe
11990 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f  cified as part o
119a0 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65  f ATTACH stateme
119b0 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nts..**.** The f
119c0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
119d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
119e0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
119f0 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72  e VFS to use (or
11a00 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69  .** a NULL to si
11a10 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c  gnify the defaul
11a20 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52  t VFS) if the UR
11a30 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  I does not conta
11a40 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a  in a "vfs=xxx".*
11a50 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
11a60 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  r. The second ar
11a70 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  gument contains 
11a80 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d  the URI (or non-
11a90 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a  URI filename).**
11aa0 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68   itself. When th
11ab0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11ac0 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67  alled the *pFlag
11ad0 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c  s variable shoul
11ae0 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65  d contain.** the
11af0 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74   default flags t
11b00 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
11b10 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e  ase handle with.
11b20 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
11b30 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20  d in.** *pFlags 
11b40 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62  may be updated b
11b50 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
11b60 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e  if the URI filen
11b70 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  ame contains .**
11b80 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20   "cache=xxx" or 
11b90 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79  "mode=xxx" query
11ba0 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a   parameters..**.
11bb0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
11bc0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
11bd0 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
11be0 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20   case *ppVfs is 
11bf0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
11c00 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20  ** the VFS that 
11c10 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74  should be used t
11c20 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
11c30 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c  ase file. *pzFil
11c40 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70  e is set to.** p
11c50 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
11c60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
11c70 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
11c80 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20   to open. It is 
11c90 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
11ca0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
11cb0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
11cc0 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ly call sqlite3_
11cd0 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73  free() to releas
11ce0 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
11cf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
11d00 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
11d10 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
11d20 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
11d30 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a  d and *pzErrMsg.
11d40 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  ** may be set to
11d50 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
11d60 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
11d70 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
11d80 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  e error .** mess
11d90 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
11da0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
11db0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
11dc0 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
11dd0 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
11de0 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
11df0 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69  te3_free()..*/.i
11e00 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  nt sqlite3ParseU
11e10 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ri(.  const char
11e20 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20   *zDefaultVfs,  
11e30 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
11e40 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78  use if no "vfs=x
11e50 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e  xx" query option
11e60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11e70 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20   *zUri,         
11e80 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
11e90 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70  minated URI to p
11ea0 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  arse */.  unsign
11eb0 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20  ed int *pFlags, 
11ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
11ed0 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e  OUT: SQLITE_OPEN
11ee0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
11ef0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70  sqlite3_vfs **pp
11f00 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
11f10 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75  /* OUT: VFS to u
11f20 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a  se */ .  char **
11f30 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  pzFile,         
11f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
11f50 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e   Filename compon
11f60 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20  ent of URI */.  
11f70 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65  /* OUT: Error me
11fa0 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51  ssage (if rc!=SQ
11fb0 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20  LITE_OK) */.){. 
11fc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11fd0 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  _OK;.  unsigned 
11fe0 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c  int flags = *pFl
11ff0 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ags;.  const cha
12000 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75  r *zVfs = zDefau
12010 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a  ltVfs;.  char *z
12020 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a  File;.  char c;.
12030 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c    int nUri = sql
12040 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72  ite3Strlen30(zUr
12050 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  i);..  assert( *
12060 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a  pzErrMsg==0 );..
12070 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20    if( ((flags & 
12080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
12090 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
120a0 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
120b0 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  ) .   && nUri>=5
120c0 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
120d0 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
120e0 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
120f0 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53  zOpt;.    int eS
12100 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
12110 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
12120 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61 72  r state when par
12130 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20  sing URI */.    
12140 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20  int iIn;        
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12160 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65 72   Input character
12170 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
12180 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20  t iOut = 0;     
12190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
121a0 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72 20  utput character 
121b0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
121c0 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b   nByte = nUri+2;
121d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
121e0 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
121f0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20  allocate */..   
12200 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
12210 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  e SQLITE_OPEN_UR
12220 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  I flag is set to
12230 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65   indicate to the
12240 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20   VFS xOpen .    
12250 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74  ** method that t
12260 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74 72  here may be extr
12270 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c  a parameters fol
12280 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d  lowing the file-
12290 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c  name.  */.    fl
122a0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
122b0 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72  EN_URI;..    for
122c0 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69  (iIn=0; iIn<nUri
122d0 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b  ; iIn++) nByte +
122e0 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26  = (zUri[iIn]=='&
122f0 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  ');.    zFile = 
12300 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
12310 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
12320 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
12330 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
12340 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 6e 64    iIn = 5;.#ifnd
12350 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f  ef SQLITE_ALLOW_
12360 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20  URI_AUTHORITY.  
12370 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
12380 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68   scheme and auth
12390 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f  ority segments o
123a0 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20  f the URI. */.  
123b0 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27    if( zUri[5]=='
123c0 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27  /' && zUri[6]=='
123d0 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  /' ){.      iIn 
123e0 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 7;.      while
123f0 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
12400 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20  Uri[iIn]!='/' ) 
12410 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
12420 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
12430 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
12440 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
12450 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
12460 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
12470 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12480 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
12490 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
124a0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
124b0 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
124c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
124d0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
124e0 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
124f0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
12500 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
12510 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
12520 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
12530 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
12540 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
12550 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
12560 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
12570 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
12580 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
12590 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
125a0 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
125b0 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
125c0 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
125d0 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
125e0 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
125f0 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
12600 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
12610 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
12620 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
12630 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
12640 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
12650 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
12660 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
12670 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
12680 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
12690 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
126a0 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
126b0 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
126c0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
126d0 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
126e0 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
126f0 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
12700 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
12710 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
12720 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
12730 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
12740 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
12750 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
12760 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
12770 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
12780 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
12790 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
127a0 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
127b0 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
127c0 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
127d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
127e0 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
127f0 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
12800 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20  f( octet==0 ){. 
12810 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
12820 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
12830 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65   when "%00" appe
12840 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55  ars within the U
12850 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  RI. In this.    
12860 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65        ** case we
12870 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74   ignore all text
12880 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
12890 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e  r of the path, n
128a0 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20  ame or.         
128b0 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e   ** value curren
128c0 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64  tly being parsed
128d0 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  . So ignore the 
128e0 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65  current characte
128f0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  r.          ** a
12900 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e  nd skip to the n
12910 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20  ext "?", "=" or 
12920 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  "&", as appropri
12930 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
12940 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
12950 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
12960 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20  !='#' .         
12970 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
12980 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20  =0 || c!='?').  
12990 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
129a0 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21  eState!=1 || (c!
129b0 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29  ='=' && c!='&'))
129c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
129d0 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20  & (eState!=2 || 
129e0 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20  c!='&').        
129f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
12a00 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
12a10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
12a20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12a30 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63  }.        c = oc
12a40 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tet;.      }else
12a50 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26   if( eState==1 &
12a60 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d  & (c=='&' || c==
12a70 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
12a80 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31  if( zFile[iOut-1
12a90 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
12aa0 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70    /* An empty op
12ab0 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72  tion name. Ignor
12ac0 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c  e this option al
12ad0 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20  together. */.   
12ae0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55         while( zU
12af0 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
12b00 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72  iIn]!='#' && zUr
12b10 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20  i[iIn-1]!='&' ) 
12b20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
12b30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12b40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12b50 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20   c=='&' ){.     
12b60 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
12b70 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  +] = '\0';.     
12b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b90 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a      eState = 2;.
12ba0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12bb0 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    c = 0;.      }
12bc0 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65  else if( (eState
12bd0 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c  ==0 && c=='?') |
12be0 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20  | (eState==2 && 
12bf0 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20  c=='&') ){.     
12c00 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
12c10 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20    eState = 1;.  
12c20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c      }.      zFil
12c30 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20  e[iOut++] = c;. 
12c40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74     }.    if( eSt
12c50 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69  ate==1 ) zFile[i
12c60 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
12c70 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
12c80 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
12c90 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
12ca0 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ';..    /* Check
12cb0 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61   if there were a
12cc0 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69  ny options speci
12cd0 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64  fied that should
12ce0 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
12cf0 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70  .    ** here. Op
12d00 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69  tions that are i
12d10 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20  nterpreted here 
12d20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e  include "vfs" an
12d30 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20  d those that.   
12d40 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74   ** correspond t
12d50 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79  o flags that may
12d60 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
12d70 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  e sqlite3_open_v
12d80 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  2().    ** metho
12d90 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d  d. */.    zOpt =
12da0 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53   &zFile[sqlite3S
12db0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
12dc0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f  ];.    while( zO
12dd0 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  pt[0] ){.      i
12de0 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65  nt nOpt = sqlite
12df0 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b  3Strlen30(zOpt);
12e00 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61  .      char *zVa
12e10 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31  l = &zOpt[nOpt+1
12e20 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  ];.      int nVa
12e30 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
12e40 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20  n30(zVal);..    
12e50 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26    if( nOpt==3 &&
12e60 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a   memcmp("vfs", z
12e70 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 3)==0 ){.  
12e80 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61        zVfs = zVa
12e90 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  l;.      }else{.
12ea0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f          struct O
12eb0 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20  penMode {.      
12ec0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12ed0 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  z;.          int
12ee0 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
12ef0 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20   *aMode = 0;.   
12f00 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65       char *zMode
12f10 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Type = 0;.      
12f20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
12f30 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69          int limi
12f40 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  t = 0;..        
12f50 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d  if( nOpt==5 && m
12f60 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a  emcmp("cache", z
12f70 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 5)==0 ){.  
12f80 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
12f90 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
12fa0 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  CacheMode[] = {.
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73              { "s
12fc0 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f  hared",  SQLITE_
12fd0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
12fe0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
12ff0 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c  { "private", SQL
13000 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
13010 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20  CACHE },.       
13020 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
13030 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
13040 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
13050 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
13060 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ACHE|SQLITE_OPEN
13070 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20  _PRIVATECACHE;. 
13080 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
13090 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20   aCacheMode;.   
130a0 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
130b0 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ask;.          z
130c0 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68  ModeType = "cach
130d0 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e";.        }.  
130e0 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
130f0 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64  4 && memcmp("mod
13100 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20  e", zOpt, 4)==0 
13110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
13120 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d  tic struct OpenM
13130 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20  ode aOpenMode[] 
13140 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
13150 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f  { "ro",  SQLITE_
13160 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
13170 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
13180 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  rw",  SQLITE_OPE
13190 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a  N_READWRITE }, .
131a0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
131b0 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  wc", SQLITE_OPEN
131c0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
131d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
131e0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
131f0 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54   "memory", SQLIT
13200 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c  E_OPEN_MEMORY },
13210 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
13220 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
13230 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
13240 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
13250 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49  _READONLY | SQLI
13260 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13270 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
13280 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
13290 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
132a0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a  TE_OPEN_MEMORY;.
132b0 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
132c0 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20  = aOpenMode;.   
132d0 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
132e0 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20  ask & flags;.   
132f0 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
13300 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20   = "access";.   
13310 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
13320 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20  if( aMode ){.   
13330 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
13340 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
13350 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13360 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69  for(i=0; aMode[i
13370 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ].z; i++){.     
13380 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
13390 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  r *z = aMode[i].
133a0 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  z;.            i
133b0 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33  f( nVal==sqlite3
133c0 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30  Strlen30(z) && 0
133d0 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a  ==memcmp(zVal, z
133e0 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  , nVal) ){.     
133f0 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20           mode = 
13400 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20  aMode[i].mode;. 
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
13420 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
13430 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
13440 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65          if( mode
13450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13460 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
13470 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13480 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a  no such %s mode:
13490 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c   %s", zModeType,
134a0 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
134b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
134c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
134d0 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
134e0 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
134f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
13500 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45   (mode & ~SQLITE
13510 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69  _OPEN_MEMORY)>li
13520 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
13530 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
13540 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13550 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f  %s mode not allo
13560 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  wed: %s",.      
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61    zModeType, zVa
135a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
135b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d  rc = SQLITE_PERM
135c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
135d0 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
135e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
135f0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
13600 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20  (flags & ~mask) 
13610 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  | mode;.        
13620 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
13630 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56   zOpt = &zVal[nV
13640 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  al+1];.    }..  
13650 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65  }else{.    zFile
13660 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
13670 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69  c(nUri+2);.    i
13680 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
13690 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
136a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c  .    memcpy(zFil
136b0 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  e, zUri, nUri);.
136c0 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20      zFile[nUri] 
136d0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
136e0 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27  e[nUri+1] = '\0'
136f0 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  ;.    flags &= ~
13700 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
13710 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d  .  }..  *ppVfs =
13720 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
13730 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a  d(zVfs);.  if( *
13740 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ppVfs==0 ){.    
13750 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
13760 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
13770 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a  such vfs: %s", z
13780 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  Vfs);.    rc = S
13790 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
137a0 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a  . parse_uri_out:
137b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
137c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
137d0 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b  te3_free(zFile);
137e0 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a  .    zFile = 0;.
137f0 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20    }.  *pFlags = 
13800 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65  flags;.  *pzFile
13810 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75   = zFile;.  retu
13820 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
13830 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
13840 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f  es the work of o
13850 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73  pening a databas
13860 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a  e on behalf of.*
13870 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
13880 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65   and sqlite3_ope
13890 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62  n16(). The datab
138a0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46  ase filename "zF
138b0 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73  ilename"  .** is
138c0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a   UTF-8 encoded..
138d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
138e0 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f  enDatabase(.  co
138f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
13900 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65  ame, /* Database
13910 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20   filename UTF-8 
13920 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c  encoded */.  sql
13930 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
13940 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
13950 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61  rned database ha
13960 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ndle */.  unsign
13970 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  ed int flags,   
13980 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20   /* Operational 
13990 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
139a0 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
139b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
139c0 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29   VFS to use */.)
139d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c      /* Store all
13a00 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65  ocated handle he
13a10 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  re */.  int rc; 
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
13a40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
13a50 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20  isThreadsafe;   
13a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13a70 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61  rue for threadsa
13a80 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  fe connections *
13a90 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20  /.  char *zOpen 
13aa0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13ab0 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
13ac0 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  argument to pass
13ad0 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20   to BtreeOpen() 
13ae0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
13af0 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sg = 0;         
13b00 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
13b10 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74  ssage from sqlit
13b20 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a  e3ParseUri() */.
13b30 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
13b40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13b50 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
13b60 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
13b70 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
13b80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
13b90 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
13ba0 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
13bb0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
13bc0 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
13bd0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
13be0 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
13bf0 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
13c00 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
13c10 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
13c20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
13c30 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
13c40 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
13c50 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
13c60 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
13c70 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
13c80 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
13c90 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
13ca0 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
13cb0 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
13cc0 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
13cd0 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
13ce0 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
13cf0 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
13d00 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
13d10 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13d20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13d40 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
13d50 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
13d60 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
13d70 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
13d80 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
13d90 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
13da0 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
13db0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
13dc0 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
13dd0 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
13de0 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
13df0 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
13e00 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
13e10 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
13e20 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
13e30 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
13e40 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
13e50 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
13e60 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65   & 0x46)==0 ) re
13e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
13e80 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20  SE_BKPT;..  if( 
13e90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
13ea0 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
13eb0 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
13ec0 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
13ed0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
13ee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
13ef0 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
13f00 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
13f10 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
13f20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
13f30 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
13f40 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
13f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
13f60 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
13f70 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
13f80 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20  FullMutex;.  }. 
13f90 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
13fa0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
13fb0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
13fc0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
13fd0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
13fe0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
13ff0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
14000 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
14010 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
14020 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
14030 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
14040 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
14050 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
14060 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
14070 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
14080 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
14090 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
140a0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
140b0 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
140c0 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
140d0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
140e0 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
140f0 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
14100 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
14110 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
14120 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
14130 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
14140 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
14150 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
14160 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
14170 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
14180 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
14190 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
141a0 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
141b0 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
141c0 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
141d0 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
141e0 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
141f0 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
14200 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
14210 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14230 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
14240 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
14250 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
14260 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
14270 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14280 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
14290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
142a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
142b0 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
142c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
142d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
142e0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
142f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14300 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
14310 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14320 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
14330 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
14340 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14350 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
14360 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
14370 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14380 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
14390 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
143a0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
143b0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
143c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
143d0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
143e0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
143f0 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
14400 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
14410 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
14420 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
14430 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
14440 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
14450 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
14460 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a  isThreadsafe ){.
14470 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
14480 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
14490 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
144a0 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
144b0 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
144c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
144d0 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
144e0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
144f0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
14500 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14510 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14520 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
14530 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
14540 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
14550 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
14560 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
14570 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
14580 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20  ->aDbStatic;..  
14590 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
145a0 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
145b0 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
145c0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
145d0 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
145e0 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
145f0 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75  imit));.  db->au
14600 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
14610 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
14620 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d  = -1;.  db->szMm
14630 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ap = sqlite3Glob
14640 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
14650 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
14660 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66  ize = 0;.  db->f
14670 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
14680 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
14690 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
146a0 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63  ger | SQLITE_Cac
146b0 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66  heSpill.#if !def
146c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
146d0 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
146e0 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44  DEX) || SQLITE_D
146f0 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
14700 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20  _INDEX.         
14710 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
14720 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69  _AutoIndex.#endi
14730 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
14740 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
14750 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
14760 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
14770 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
14780 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
14790 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
147a0 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
147b0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
147c0 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
147d0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
147e0 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56  DEFAULT_RECURSIV
147f0 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20  E_TRIGGERS.     
14800 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
14810 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
14820 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
14830 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
14840 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29  LT_FOREIGN_KEYS)
14850 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55   && SQLITE_DEFAU
14860 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a  LT_FOREIGN_KEYS.
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   | SQLITE_Foreig
14890 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20 20 20  nKeys.#endif.   
148a0 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
148b0 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c  shInit(&db->aCol
148c0 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
148d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
148e0 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
148f0 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
14900 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
14910 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
14920 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
14930 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
14940 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
14950 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
14960 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
14970 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
14980 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
14990 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
149a0 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
149b0 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
149c0 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
149d0 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
149e0 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
149f0 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
14a00 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
14a10 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
14a20 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
14a30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
14a40 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
14a50 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
14a60 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
14a70 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
14a80 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
14a90 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
14aa0 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16LE, 0, binCol
14ab0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
14ac0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
14ad0 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45   "RTRIM", SQLITE
14ae0 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c  _UTF8, (void*)1,
14af0 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
14b00 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14b10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14b20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14b30 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74  .  }.  db->pDflt
14b40 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
14b50 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  ndCollSeq(db, SQ
14b60 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41  LITE_UTF8, "BINA
14b70 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  RY", 0);.  asser
14b80 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  t( db->pDfltColl
14b90 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  !=0 );..  /* Als
14ba0 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20 63 61  o add a UTF-8 ca
14bb0 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63  se-insensitive c
14bc0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14bd0 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  e. */.  createCo
14be0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43  llation(db, "NOC
14bf0 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ASE", SQLITE_UTF
14c00 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c  8, 0, nocaseColl
14c10 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a  atingFunc, 0);..
14c20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66    /* Parse the f
14c30 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75  ilename/URI argu
14c40 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f  ment. */.  db->o
14c50 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  penFlags = flags
14c60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
14c70 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a  ParseUri(zVfs, z
14c80 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73  Filename, &flags
14c90 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f  , &db->pVfs, &zO
14ca0 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  pen, &zErrMsg);.
14cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
14cd0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
14ce0 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ) db->mallocFail
14cf0 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  ed = 1;.    sqli
14d00 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
14d10 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
14d20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
14d30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14d40 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
14d50 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
14d60 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
14d70 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
14d80 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
14d90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
14da0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
14db0 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
14dc0 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
14df0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
14e00 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
14e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14e20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
14e30 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
14e40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14e50 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
14e60 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
14e70 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74   rc, 0);.    got
14e80 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
14e90 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  }.  db->aDb[0].p
14ea0 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
14eb0 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62  SchemaGet(db, db
14ec0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
14ed0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
14ee0 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
14ef0 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
14f00 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
14f10 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  t safety_level f
14f20 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
14f30 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20  base is 'full'; 
14f40 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a  for the temp.  *
14f50 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73  * database it is
14f60 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61   'NONE'. This ma
14f70 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
14f80 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20  layer defaults. 
14f90 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62   .  */.  db->aDb
14fa0 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69  [0].zName = "mai
14fb0 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  n";.  db->aDb[0]
14fc0 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
14fd0 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  3;.  db->aDb[1].
14fe0 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a  zName = "temp";.
14ff0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66    db->aDb[1].saf
15000 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a  ety_level = 1;..
15010 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
15020 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
15030 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
15040 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
15050 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
15060 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
15070 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20  er all built-in 
15080 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64  functions, but d
15090 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
150a0 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64   read the.  ** d
150b0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79  atabase schema y
150c0 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61  et. This is dela
150d0 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  yed until the fi
150e0 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  rst time the dat
150f0 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63  abase.  ** is ac
15100 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  cessed..  */.  s
15110 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
15120 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
15130 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
15140 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
15150 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  (db);..  /* Load
15160 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e   automatic exten
15170 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f  sions - extensio
15180 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ns that have bee
15190 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a  n registered.  *
151a0 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
151b0 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78  te3_automatic_ex
151c0 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20  tension() API.. 
151d0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
151e0 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
151f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15200 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
15210 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73  e3AutoLoadExtens
15220 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63  ions(db);.    rc
15230 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
15240 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  de(db);.    if( 
15250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15260 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
15270 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
15280 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
15290 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69  _ENABLE_FTS1.  i
152a0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
152b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65  iled ){.    exte
152c0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
152d0 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s1Init(sqlite3*)
152e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
152f0 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a  e3Fts1Init(db);.
15300 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
15310 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15320 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d  _FTS2.  if( !db-
15330 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
15340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15350 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
15360 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
15370 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
15380 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
15390 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
153a0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
153b0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a  ITE_ENABLE_FTS3.
153c0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
153d0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
153e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
153f0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
15400 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
15410 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
15420 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20  ITE_ENABLE_ICU. 
15430 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
15440 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
15450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
15460 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e  c = sqlite3IcuIn
15470 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
15480 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
15490 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20  E_ENABLE_RTREE. 
154a0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
154b0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
154c0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
154d0 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49   = sqlite3RtreeI
154e0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
154f0 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  dif..  /* -DSQLI
15500 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
15510 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
15520 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
15530 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
15540 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
15550 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
15560 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
15570 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
15580 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
15590 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
155a0 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
155b0 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
155c0 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
155d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
155e0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
155f0 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
15600 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
15610 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
15620 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
15630 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
15640 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
15650 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
15660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15670 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
15680 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
15690 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
156a0 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69  .  if( rc ) sqli
156b0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
156c0 20 30 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c   0);..  /* Enabl
156d0 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
156e0 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
156f0 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
15700 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
15710 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15720 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
15750 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
15760 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
15770 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
15780 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
15790 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
157a0 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
157b0 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ndb_out:.  sqlit
157c0 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a  e3_free(zOpen);.
157d0 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
157e0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65  assert( db->mute
157f0 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64  x!=0 || isThread
15800 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  safe==0 || sqlit
15810 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
15820 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  FullMutex==0 );.
15830 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15840 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
15850 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  x);.  }.  rc = s
15860 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
15870 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
15880 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
15890 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28  E_NOMEM );.  if(
158a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
158b0 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
158c0 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
158d0 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
158e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
158f0 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
15900 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
15910 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70  C_SICK;.  }.  *p
15920 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66  pDb = db;.#ifdef
15930 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15940 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
15950 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15960 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
15970 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68  * Opening a db h
15980 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
15990 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
159a0 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  d 0. */.    void
159b0 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33   *pArg = sqlite3
159c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
159d0 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c  llogArg;.    sql
159e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
159f0 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64  .xSqllog(pArg, d
15a00 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  b, zFilename, 0)
15a10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
15a20 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69  eturn sqlite3Api
15a30 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a  Exit(0, rc);.}..
15a40 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
15a50 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15a60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15a70 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
15a80 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
15a90 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
15aa0 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
15ab0 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
15ac0 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
15af0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
15b00 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
15b10 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
15b20 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
15b30 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
15b40 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
15b50 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
15b60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
15b70 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
15b80 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
15b90 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
15ba0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
15bb0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
15bc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
15bd0 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
15be0 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
15bf0 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
15c00 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
15c10 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
15c20 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  b, (unsigned int
15c30 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d  )flags, zVfs);.}
15c40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15c50 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
15c60 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
15c70 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
15c80 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
15c90 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  n16(.  const voi
15ca0 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  d *zFilename, . 
15cb0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a   sqlite3 **ppDb.
15cc0 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
15cd0 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f  *zFilename8;   /
15ce0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f  * zFilename enco
15cf0 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73  ded in UTF-8 ins
15d00 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a  tead of UTF-16 *
15d10 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
15d20 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
15d30 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46  c;..  assert( zF
15d40 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73  ilename );.  ass
15d50 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a  ert( ppDb );.  *
15d60 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
15d70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15d80 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
15d90 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
15da0 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
15db0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
15dc0 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
15dd0 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
15de0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
15df0 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
15e00 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
15e10 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
15e20 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
15e30 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
15e40 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
15e50 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
15e60 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
15e70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
15e80 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
15e90 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15ec0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
15ed0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
15ee0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
15ef0 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  pDb || rc==SQLIT
15f00 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
15f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15f20 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72   && !DbHasProper
15f30 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f  ty(*ppDb, 0, DB_
15f40 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b  SchemaLoaded) ){
15f50 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62  .      ENC(*ppDb
15f60 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ) = SQLITE_UTF16
15f70 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20  NATIVE;.    }.  
15f80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
15f90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15fa0 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  }.  sqlite3Value
15fb0 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
15fc0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69  eturn sqlite3Api
15fd0 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23  Exit(0, rc);.}.#
15fe0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15ff0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
16000 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
16010 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
16020 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
16030 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16040 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
16050 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
16060 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
16070 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
16080 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
16090 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
160a0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
160b0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
160c0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
160d0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
160e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
160f0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16100 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
16110 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
16120 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
16130 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
16140 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
16150 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
16160 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d  pare, 0);.  rc =
16170 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
16180 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
16190 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
161a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
161b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
161c0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
161d0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
161e0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
161f0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
16200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
16210 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
16220 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  v2(.  sqlite3* d
16230 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
16240 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
16250 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
16260 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
16270 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
16280 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
16290 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
162a0 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
162b0 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
162c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
162d0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
162e0 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
162f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
16300 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
16310 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
16320 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
16330 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29   xCompare, xDel)
16340 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16350 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
16360 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16370 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
16380 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16390 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
163a0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
163b0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
163c0 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
163d0 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
163e0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
163f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16400 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
16410 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  n16(.  sqlite3* 
16420 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  db, .  const voi
16430 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  d *zName,.  int 
16440 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
16450 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
16460 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
16470 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
16480 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
16490 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
164a0 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  _OK;.  char *zNa
164b0 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  me8;.  sqlite3_m
164c0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
164d0 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
164e0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
164f0 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d  ed );.  zName8 =
16500 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
16510 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  (db, zName, -1, 
16520 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
16530 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  VE);.  if( zName
16540 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72  8 ){.    rc = cr
16550 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
16560 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e  , zName8, (u8)en
16570 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
16580 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
16590 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
165a0 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  me8);.  }.  rc =
165b0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
165c0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
165d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
165e0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
165f0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
16600 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16610 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
16620 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
16630 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
16640 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
16650 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
16660 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
16670 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
16680 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
16690 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
166a0 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
166b0 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
166c0 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73  tion_needed(.  s
166d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
166e0 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
166f0 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
16700 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a  ollNeeded)(void*
16710 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
16720 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61  extRep,const cha
16730 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  r*).){.  sqlite3
16740 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16750 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
16760 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
16770 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
16780 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
16790 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
167a0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
167b0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
167c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
167d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
167e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
167f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
16800 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
16810 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
16820 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
16830 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
16840 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
16850 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
16860 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
16870 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
16880 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
16890 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
168a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
168b0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
168c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
168d0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
168e0 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
168f0 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
16900 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
16910 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
16920 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
16930 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
16940 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
16950 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
16960 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
16970 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
16980 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
16990 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
169a0 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
169b0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
169c0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
169d0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
169e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
169f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16a00 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
16a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
16a20 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
16a30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16a40 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e   now an anachron
16a50 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20  ism. It used to 
16a60 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76  be used to recov
16a70 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c  er from a.** mal
16a80 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62  loc() failure, b
16a90 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f  ut SQLite now do
16aa0 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69  es this automati
16ab0 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cally..*/.int sq
16ac0 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
16ad0 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65  over(void){.  re
16ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16af0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16b00 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  Test to see whet
16b10 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64  her or not the d
16b20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16b30 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  on is in autocom
16b40 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65  mit.** mode.  Re
16b50 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
16b60 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  is and FALSE if 
16b70 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  not.  Autocommit
16b80 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62   mode is on.** b
16b90 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f  y default.  Auto
16ba0 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c  commit is disabl
16bb0 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74  ed by a BEGIN st
16bc0 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e  atement and reen
16bd0 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  abled.** by the 
16be0 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52  next COMMIT or R
16bf0 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  OLLBACK..*/.int 
16c00 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
16c10 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
16c20 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
16c30 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
16c40 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
16c50 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
16c60 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f 72  e subtitutes for
16c70 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54   constants SQLIT
16c80 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51  E_CORRUPT,.** SQ
16c90 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c  LITE_MISUSE, SQL
16ca0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51  ITE_CANTOPEN, SQ
16cb0 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70  LITE_IOERR and p
16cc0 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72  ossibly other er
16cd0 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ror.** constants
16ce0 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20 74  .  They server t
16cf0 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
16d00 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
16d10 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
16d20 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
16d30 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
16d40 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
16d50 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
16d60 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
16d70 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
16d80 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
16d90 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
16da0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
16db0 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
16dc0 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
16dd0 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
16de0 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
16df0 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
16e00 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
16e10 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
16e20 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
16e30 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16e40 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
16e50 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
16e60 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20  _CORRUPT,.      
16e70 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73          "databas
16e80 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20  e corruption at 
16e90 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
16ea0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
16eb0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
16ec0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
16ed0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16ee0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e  TE_CORRUPT;.}.in
16ef0 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
16f00 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
16f10 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
16f20 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16f30 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
16f40 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
16f50 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20  E_MISUSE, .     
16f60 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65           "misuse
16f70 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
16f80 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
16f90 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
16fa0 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
16fb0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
16fc0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d  SQLITE_MISUSE;.}
16fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
16fe0 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
16ff0 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
17000 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
17010 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
17020 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
17030 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
17040 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17050 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
17060 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
17070 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
17080 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
17090 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
170a0 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
170b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
170c0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
170d0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
170e0 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
170f0 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  is a convenience
17100 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
17110 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c  kes sure that al
17120 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  l thread-specifi
17130 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68  c.** data for th
17140 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65  is thread has be
17150 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  en deallocated..
17160 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20  **.** SQLite no 
17170 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65  longer uses thre
17180 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
17190 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
171a0 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d   is now a.** no-
171b0 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69  op.  It is retai
171c0 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ned for historic
171d0 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  al compatibility
171e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
171f0 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
17200 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66  (void){.}.#endif
17210 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
17220 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
17230 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
17240 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
17250 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
17260 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
17270 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
17280 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
17290 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ls..*/.#ifdef SQ
172a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
172b0 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20  MN_METADATA.int 
172c0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
172d0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
172e0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17300 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
17310 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
17320 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
17330 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
17340 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
17350 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
17360 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
17370 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
17380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
17390 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
173a0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
173b0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
173c0 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
173d0 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
173e0 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
173f0 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
17400 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
17410 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
17420 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
17430 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
17440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17450 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
17460 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
17470 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
17480 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
17490 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
174a0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
174b0 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
174c0 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
174d0 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
174e0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
174f0 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73  rue if column is
17500 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
17510 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
17520 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
17530 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
17540 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
17550 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
17560 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20  t iCol;..  char 
17570 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65  const *zDataType
17580 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
17590 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30  st *zCollSeq = 0
175a0 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20  ;.  int notnull 
175b0 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61  = 0;.  int prima
175c0 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  rykey = 0;.  int
175d0 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20   autoinc = 0;.. 
175e0 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
175f0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
17600 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
17610 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
17620 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
17630 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
17640 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
17650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
17660 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
17670 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
17680 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
17690 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
176a0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
176b0 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
176c0 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
176d0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
176e0 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
176f0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
17700 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
17710 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
17720 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
17730 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
17740 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
17750 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
17760 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
17770 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ed */.  if( sqli
17780 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
17790 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69  mnName) ){.    i
177a0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
177b0 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  y;.    if( iCol>
177c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  =0 ){.      pCol
177d0 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
177e0 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Col];.    }.  }e
177f0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
17800 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
17810 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
17820 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
17830 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
17840 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
17850 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
17860 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
17870 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
17880 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17890 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
178a0 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
178b0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b  .      pTab = 0;
178c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  .      goto erro
178d0 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  r_out;.    }.  }
178e0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
178f0 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
17900 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
17910 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
17920 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
17930 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
17940 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
17950 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
17960 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
17970 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
17980 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
17990 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
179a0 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
179b0 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
179c0 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
179d0 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
179e0 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
179f0 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
17a00 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
17a10 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
17a20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
17a30 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
17a40 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
17a50 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
17a60 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
17a70 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
17a80 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
17a90 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
17aa0 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
17ab0 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
17ac0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
17ad0 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
17ae0 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
17af0 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c  zDataType = pCol
17b00 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f  ->zType;.    zCo
17b10 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
17b20 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
17b30 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
17b40 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
17b50 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f  key  = (pCol->co
17b60 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
17b70 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20  _PRIMKEY)!=0;.  
17b80 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
17b90 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
17ba0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
17bb0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
17bc0 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
17bd0 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
17be0 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
17bf0 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
17c00 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
17c10 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
17c20 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b  lSeq = "BINARY";
17c30 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
17c40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17c50 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
17c60 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66  /* Whether the f
17c70 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63  unction call suc
17c80 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64  ceeded or failed
17c90 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  , set the output
17ca0 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a   parameters.  **
17cb0 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65   to whatever the
17cc0 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72  ir local counter
17cd0 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49  parts contain. I
17ce0 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f  f an error did o
17cf0 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20  ccur,.  ** this 
17d00 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
17d10 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75  f zeroing all ou
17d20 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
17d30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61  .  */.  if( pzDa
17d40 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61  taType ) *pzData
17d50 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65  Type = zDataType
17d60 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65  ;.  if( pzCollSe
17d70 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d  q ) *pzCollSeq =
17d80 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28   zCollSeq;.  if(
17d90 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f   pNotNull ) *pNo
17da0 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b  tNull = notnull;
17db0 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b  .  if( pPrimaryK
17dc0 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65  ey ) *pPrimaryKe
17dd0 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  y = primarykey;.
17de0 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29    if( pAutoinc )
17df0 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74   *pAutoinc = aut
17e00 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c  oinc;..  if( SQL
17e10 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70  ITE_OK==rc && !p
17e20 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
17e30 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
17e40 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d  rMsg);.    zErrM
17e50 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
17e60 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68  ntf(db, "no such
17e70 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25   table column: %
17e80 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d  s.%s", zTableNam
17e90 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  e,.        zColu
17ea0 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  mnName);.    rc 
17eb0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17ec0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
17ed0 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72  or(db, rc, (zErr
17ee0 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72  Msg?"%s":0), zEr
17ef0 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
17f00 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
17f10 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  sg);.  rc = sqli
17f20 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
17f30 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
17f40 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
17f50 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
17f60 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
17f70 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
17f80 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
17f90 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
17fa0 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
17fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c  /.int sqlite3_sl
17fc0 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73  eep(int ms){.  s
17fd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
17fe0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56  ;.  int rc;.  pV
17ff0 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
18000 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
18010 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVfs==0 ) return
18020 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
18030 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e  unction works in
18040 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62   milliseconds, b
18050 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ut the underlyin
18060 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a  g OsSleep() .  *
18070 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f  * API uses micro
18080 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74  seconds. Hence t
18090 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a  he 1000's..  */.
180a0 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f    rc = (sqlite3O
180b0 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30  sSleep(pVfs, 100
180c0 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72  0*ms)/1000);.  r
180d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
180e0 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
180f0 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65  able the extende
18100 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a  d result codes..
18110 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
18120 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
18130 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  odes(sqlite3 *db
18140 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20  , int onoff){.  
18150 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18160 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
18170 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20    db->errMask = 
18180 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66  onoff ? 0xffffff
18190 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c  ff : 0xff;.  sql
181a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
181b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
181c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
181d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
181e0 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
181f0 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61  l method on a pa
18200 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
18210 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18220 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73  3_file_control(s
18230 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
18240 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
18250 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
18260 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Arg){.  int rc =
18270 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
18280 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a   Btree *pBtree;.
18290 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
182a0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
182b0 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71  );.  pBtree = sq
182c0 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
182d0 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
182e0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
182f0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
18300 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  er;.    sqlite3_
18310 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71  file *fd;.    sq
18320 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18330 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61  pBtree);.    pPa
18340 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
18350 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b  eePager(pBtree);
18360 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18370 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64  ger!=0 );.    fd
18380 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
18390 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
183a0 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29   assert( fd!=0 )
183b0 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51  ;.    if( op==SQ
183c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f  LITE_FCNTL_FILE_
183d0 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
183e0 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a   *(sqlite3_file*
183f0 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20  *)pArg = fd;.   
18400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
18410 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
18420 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
18430 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18440 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
18450 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  (fd, op, pArg);.
18460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
18480 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20  FOUND;.    }.   
18490 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
184a0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
184b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
184c0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
184d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ;.  return rc;  
184e0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72   .}../*.** Inter
184f0 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74  face to the test
18500 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e  ing logic..*/.in
18510 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  t sqlite3_test_c
18520 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e  ontrol(int op, .
18530 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ..){.  int rc = 
18540 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
18550 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54  E_OMIT_BUILTIN_T
18560 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  EST.  va_list ap
18570 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
18580 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
18590 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20  op ){..    /*.  
185a0 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75    ** Save the cu
185b0 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
185c0 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a  he PRNG..    */.
185d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
185e0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
185f0 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
18600 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65  te3PrngSaveState
18610 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
18620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
18630 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68     ** Restore th
18640 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  e state of the P
18650 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20  RNG to the last 
18660 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e  state saved usin
18670 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41  g.    ** PRNG_SA
18680 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56  VE.  If PRNG_SAV
18690 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  E has never befo
186a0 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  re been called, 
186b0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  then.    ** this
186c0 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20   verb acts like 
186d0 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20  PRNG_RESET..    
186e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
186f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
18700 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  _RESTORE: {.    
18710 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73    sqlite3PrngRes
18720 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20  toreState();.   
18730 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18740 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
18750 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61  eset the PRNG ba
18760 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74  ck to its uninit
18770 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20  ialized state.  
18780 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20  The next call.  
18790 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
187a0 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c  randomness() wil
187b0 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e  l reseed the PRN
187c0 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  G using a single
187d0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
187e0 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20  the xRandomness 
187f0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65  method of the de
18800 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a  fault VFS..    *
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 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73  RESET: {.      s
18840 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
18850 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72  s(0,0);.      br
18860 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
18870 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
18880 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
18890 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a  BITVEC_TEST, siz
188a0 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20  e, program).    
188b0 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20  **.    ** Run a 
188c0 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42  test against a B
188d0 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20  itvec object of 
188e0 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72  size.  The progr
188f0 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20  am argument.    
18900 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
18910 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20  f integers that 
18920 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74  defines the test
18930 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20  .  Return -1 on 
18940 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  a.    ** memory 
18950 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
18960 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  , 0 on success, 
18970 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  or non-zero for 
18980 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a  an error..    **
18990 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
189a0 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
189b0 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  t() for addition
189c0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
189d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
189e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
189f0 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20  BITVEC_TEST: {. 
18a00 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
18a10 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
18a20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20       int *aProg 
18a30 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
18a40 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  *);.      rc = s
18a50 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
18a60 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f  tinTest(sz, aPro
18a70 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
18a80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
18a90 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
18aa0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c  est_control(FAUL
18ab0 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c  T_INSTALL, xCall
18ac0 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20  back).    **.   
18ad0 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69   ** Arrange to i
18ae0 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28  nvoke xCallback(
18af0 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74  ) whenever sqlit
18b00 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20  e3FaultSim() is 
18b10 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69  called,.    ** i
18b20 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e  f xCallback is n
18b30 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a  ot NULL..    **.
18b40 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74      ** As a test
18b50 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73 69   of the fault si
18b60 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73  mulator mechanis
18b70 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65  m itself, sqlite
18b80 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20  3FaultSim(0).   
18b90 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d   ** is called im
18ba0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
18bb0 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e  installing the n
18bc0 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  ew callback and 
18bd0 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  the return.    *
18be0 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c  * value from sql
18bf0 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20  ite3FaultSim(0) 
18c00 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75  becomes the retu
18c10 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  rn from.    ** s
18c20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
18c30 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  rol()..    */.  
18c40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
18c50 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53  STCTRL_FAULT_INS
18c60 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TALL: {.      /*
18c70 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61   MSVC is picky a
18c80 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e  bout pulling fun
18c90 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c  c ptrs from va l
18ca0 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68  ists..      ** h
18cb0 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69  ttp://support.mi
18cc0 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34  crosoft.com/kb/4
18cd0 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71  7961.      ** sq
18ce0 6c 69 74 65 33 43 6f 6e 66 69 67 2e 78 54 65 73  lite3Config.xTes
18cf0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
18d00 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e  rg(ap, int(*)(in
18d10 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  t));.      */.  
18d20 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28      typedef int(
18d30 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e  *TESTCALLBACKFUN
18d40 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20  C_t)(int);.     
18d50 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 78   sqlite3Config.x
18d60 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76  TestCallback = v
18d70 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43 41  a_arg(ap, TESTCA
18d80 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20  LLBACKFUNC_t);. 
18d90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18da0 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20  3FaultSim(0);.  
18db0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18dc0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
18dd0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
18de0 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
18df0 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
18e00 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
18e10 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
18e20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
18e30 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
18e40 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
18e50 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
18e60 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
18e70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18e80 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
18e90 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
18ea0 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
18eb0 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
18ec0 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
18ed0 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
18ee0 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
18ef0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
18f00 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
18f10 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
18f20 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
18f30 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
18f40 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
18f50 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
18f60 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
18f70 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
18f80 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
18f90 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
18fa0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18fb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
18fc0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
18fd0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
18fe0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
18ff0 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64  G_BYTE, unsigned
19000 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
19010 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45     ** Set the PE
19020 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68  NDING byte to th
19030 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  e value in the a
19040 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e  rgument, if X>0.
19050 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20  .    ** Make no 
19060 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e  changes if X==0.
19070 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
19080 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ue of the pendin
19090 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73  g byte.    ** as
190a0 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66   it existing bef
190b0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
190c0 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
190d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52   **.    ** IMPOR
190e0 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20  TANT:  Changing 
190f0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
19100 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30   from 0x40000000
19110 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20   results in.    
19120 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ** an incompatib
19130 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  le database file
19140 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69   format.  Changi
19150 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
19160 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  yte.    ** while
19170 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f   any database co
19180 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
19190 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65   results in unde
191a0 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  fined and.    **
191b0 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68   dileterious beh
191c0 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  avior..    */.  
191d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
191e0 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
191f0 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  YTE: {.      rc 
19200 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
19210 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19220 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a  MIT_WSD.      {.
19230 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
19240 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61   int newVal = va
19250 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65  _arg(ap, unsigne
19260 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  d int);.        
19270 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c  if( newVal ) sql
19280 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20  ite3PendingByte 
19290 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20  = newVal;.      
192a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
192b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
192c0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
192d0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
192e0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
192f0 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a  _ASSERT, int X).
19300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
19310 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
19320 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
19330 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
19340 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  r or not.    ** 
19350 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61  assert() was ena
19360 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
19370 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74  time.  If X is t
19380 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  rue and assert()
19390 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c  .    ** is enabl
193a0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
193b0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75  urn value is tru
193c0 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
193d0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65   and.    ** asse
193e0 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
193f0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
19400 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
19410 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a    If X is.    **
19420 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
19430 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  t() is enabled, 
19440 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69  then the asserti
19450 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65  on fires and the
19460 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
19470 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73  aborts.  If X is
19480 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72   false and asser
19490 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
194a0 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
194b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
194c0 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
194d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
194e0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b  STCTRL_ASSERT: {
194f0 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20  .      volatile 
19500 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
19510 20 61 73 73 65 72 74 28 20 28 78 20 3d 20 76 61   assert( (x = va
19520 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30  _arg(ap,int))!=0
19530 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78   );.      rc = x
19540 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19550 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20     }...    /*.  
19560 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
19570 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
19580 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
19590 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  S, int X).    **
195a0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74  .    ** This act
195b0 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72  ion provides a r
195c0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20  un-time test to 
195d0 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41  see how the ALWA
195e0 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45  YS and.    ** NE
195f0 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20  VER macros were 
19600 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  defined at compi
19610 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a  le-time..    **.
19620 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72      ** The retur
19630 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59  n value is ALWAY
19640 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  S(X).  .    **. 
19650 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d     ** The recomm
19660 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d  ended test is X=
19670 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  =2.  If the retu
19680 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74  rn value is 2, t
19690 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  hat means.    **
196a0 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
196b0 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e  VER() are both n
196c0 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
196d0 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20  h macros, which 
196e0 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  is the.    ** de
196f0 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20  fault setting.  
19700 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
19710 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41  lue is 1, then A
19720 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65  LWAYS() is eithe
19730 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f  r.    ** hard-co
19740 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65  ded to true or e
19750 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69  lse it asserts i
19760 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69  f its argument i
19770 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
19780 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69  The first behavi
19790 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74  or (hard-coded t
197a0 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63  o true) is the c
197b0 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51  ase if.    ** SQ
197c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
197d0 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20  SERT shows that 
197e0 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
197f0 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63  bled and the sec
19800 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76  ond.    ** behav
19810 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74  ior (assert if t
19820 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41  he argument to A
19830 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65  LWAYS() is false
19840 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66  ) is the case if
19850 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  .    ** SQLITE_T
19860 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73  ESTCTRL_ASSERT s
19870 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74  hows that assert
19880 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  () is enabled.. 
19890 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
198a0 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70   run-time test p
198b0 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c  rocedure might l
198c0 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  ook something li
198d0 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a  ke this:.    **.
198e0 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71      **    if( sq
198f0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
19900 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
19910 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32  RL_ALWAYS, 2)==2
19920 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   ){.    **      
19930 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  // ALWAYS() and 
19940 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f  NEVER() are no-o
19950 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
19960 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20  acros.    **    
19970 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
19980 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
19990 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
199a0 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20  SSERT, 1) ){.   
199b0 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
199c0 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68  YS(x) asserts th
199d0 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45  at x is true. NE
199e0 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78  VER(x) asserts x
199f0 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
19a00 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  *    }else{.    
19a10 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
19a20 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61  S(x) is a consta
19a30 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20  nt 1.  NEVER(x) 
19a40 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e  is a constant 0.
19a50 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20  .    **    }.   
19a60 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19a70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
19a80 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AYS: {.      int
19a90 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
19aa0 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
19ab0 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20  ALWAYS(x);.     
19ac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
19ad0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73     /*.    **   s
19ae0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19af0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19b00 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a  TRL_BYTEORDER);.
19b10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
19b20 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e  e integer return
19b30 65 64 20 72 65 76 65 61 6c 73 20 74 68 65 20 62  ed reveals the b
19b40 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65  yte-order of the
19b50 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69   computer on whi
19b60 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65  ch.    ** SQLite
19b70 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20   is running:.   
19b80 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
19b90 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61   1     big-endia
19ba0 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
19bb0 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20   at run-time.   
19bc0 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20 20   **      10     
19bd0 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64  little-endian, d
19be0 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
19bf0 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33  -time.    **  43
19c00 32 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64  2101     big-end
19c10 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
19c20 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
19c30 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31  me.    **  12341
19c40 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64  0     little-end
19c50 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20  ian, determined 
19c60 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
19c70 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65      */ .    case
19c80 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19c90 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20  _BYTEORDER: {.  
19ca0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19cb0 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20  BYTEORDER*100 + 
19cc0 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44  SQLITE_LITTLEEND
19cd0 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f  IAN*10 + SQLITE_
19ce0 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20  BIGENDIAN;.     
19cf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
19d00 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
19d10 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
19d20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
19d30 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64  ERVE, sqlite3 *d
19d40 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a  b, int N).    **
19d50 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
19d60 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f  nReserve size to
19d70 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20   N for the main 
19d80 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20  database on the 
19d90 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
19da0 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20  connection db.. 
19db0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19dc0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
19dd0 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20  ESERVE: {.      
19de0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
19df0 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
19e00 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  *);.      int x 
19e10 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
19e20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
19e30 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
19e40 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71  mutex);.      sq
19e50 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
19e60 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d  eSize(db->aDb[0]
19e70 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a  .pBt, 0, x, 0);.
19e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
19e90 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
19ea0 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tex);.      brea
19eb0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
19ec0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
19ed0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19ee0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
19ef0 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64  IONS, sqlite3 *d
19f00 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a  b, int N).    **
19f10 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f  .    ** Enable o
19f20 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75  r disable variou
19f30 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
19f40 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
19f50 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20  oses.  The .    
19f60 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73  ** argument N is
19f70 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70   a bitmask of op
19f80 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62  timizations to b
19f90 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72  e disabled.  For
19fa0 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f   normal.    ** o
19fb0 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c  peration N shoul
19fc0 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65  d be 0.  The ide
19fd0 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74  a is that a test
19fe0 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74   program (like t
19ff0 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f  he.    ** SQL Lo
1a000 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20  gic Test or SLT 
1a010 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e  test module) can
1a020 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51   run the same SQ
1a030 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  L multiple times
1a040 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72  .    ** with var
1a050 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
1a060 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76  ns disabled to v
1a070 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73  erify that the s
1a080 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a  ame answer.    *
1a090 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e  * is obtained in
1a0a0 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20   every case..   
1a0b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1a0c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
1a0d0 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20  IMIZATIONS: {.  
1a0e0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1a0f0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
1a100 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
1a110 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28  ->dbOptFlags = (
1a120 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20  u16)(va_arg(ap, 
1a130 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a  int) & 0xffff);.
1a140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a150 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1a160 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20  E_N_KEYWORD.    
1a170 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
1a180 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1a190 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
1a1a0 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  D, const char *z
1a1b0 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  Word).    **.   
1a1c0 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20   ** If zWord is 
1a1d0 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e  a keyword recogn
1a1e0 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ized by the pars
1a1f0 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  er, then return 
1a200 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
1a210 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20  r of keywords.  
1a220 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e  Or if zWord is n
1a230 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65  ot a keyword, re
1a240 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a  turn 0..    ** .
1a250 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
1a260 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79   feature is only
1a270 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
1a280 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73  e amalgamation s
1a290 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ince.    ** the 
1a2a0 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
1a2b0 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65   macro is not de
1a2c0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69  fined in this fi
1a2d0 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20  le if SQLite.   
1a2e0 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69   ** is built usi
1a2f0 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72  ng separate sour
1a300 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f  ce files..    */
1a310 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1a320 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
1a330 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ORD: {.      con
1a340 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d  st char *zWord =
1a350 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
1a360 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
1a370 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
1a380 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a  trlen30(zWord);.
1a390 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69        rc = (sqli
1a3a0 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28  te3KeywordCode((
1a3b0 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54  u8*)zWord, n)!=T
1a3c0 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e  K_ID) ? SQLITE_N
1a3d0 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20  _KEYWORD : 0;.  
1a3e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a3f0 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a  .#endif ..    /*
1a400 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1a410 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1a420 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
1a430 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20  LOC, sz, &pNew, 
1a440 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20  pFree);.    **. 
1a450 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65     ** Pass pFree
1a460 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72   into sqlite3Scr
1a470 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20  atchFree(). .   
1a480 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e   ** If sz>0 then
1a490 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61   allocate a scra
1a4a0 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20  tch buffer into 
1a4b0 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  pNew.  .    */. 
1a4c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1a4d0 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
1a4e0 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76  ALLOC: {.      v
1a4f0 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70  oid *pFree, **pp
1a500 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  New;.      int s
1a510 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61  z;.      sz = va
1a520 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1a530 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f       ppNew = va_
1a540 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b  arg(ap, void**);
1a550 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76  .      pFree = v
1a560 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
1a570 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29  ;.      if( sz )
1a580 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65   *ppNew = sqlite
1a590 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73  3ScratchMalloc(s
1a5a0 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
1a5b0 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72  3ScratchFree(pFr
1a5c0 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ee);.      break
1a5d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a5e0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1a5f0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1a600 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
1a610 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66  _FAULT, int onof
1a620 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  f);.    **.    *
1a630 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f  * If parameter o
1a640 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  noff is non-zero
1a650 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  , configure the 
1a660 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74  wrappers so that
1a670 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73   all.    ** subs
1a680 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
1a690 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20  localtime() and 
1a6a0 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49  variants fail. I
1a6b0 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c  f onoff is zero,
1a6c0 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69  .    ** undo thi
1a6d0 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  s setting..    *
1a6e0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1a6f0 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
1a700 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20  TIME_FAULT: {.  
1a710 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1a720 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69  lConfig.bLocalti
1a730 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67  meFault = va_arg
1a740 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1a750 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
1a760 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1a770 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1a780 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20  PLAIN).    /*   
1a790 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a7a0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1a7b0 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d  CTRL_EXPLAIN_STM
1a7c0 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  T,.    **       
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63   sqlite3_stmt*,c
1a7f0 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20  onst char**);.  
1a800 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63    **.    ** If c
1a810 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
1a820 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
1a830 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71  EXPLAIN, each sq
1a840 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73  lite3_stmt holds
1a850 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67  .    ** a string
1a860 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1a870 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61  the optimized pa
1a880 72 73 65 20 74 72 65 65 2e 20 20 54 68 69 73 20  rse tree.  This 
1a890 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20  test-control.   
1a8a0 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
1a8b0 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74  inter to that st
1a8c0 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ring..    */.   
1a8d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1a8e0 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54  TCTRL_EXPLAIN_ST
1a8f0 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MT: {.      sqli
1a900 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1a910 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
1a920 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20  ite3_stmt*);.   
1a930 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a     const char **
1a940 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61  pzRet = va_arg(a
1a950 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  p, const char**)
1a960 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d  ;.      *pzRet =
1a970 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
1a980 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70  anation((Vdbe*)p
1a990 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Stmt);.      bre
1a9a0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1a9b0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1a9c0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1a9d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a9e0 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69  NEVER_CORRUPT, i
1a9f0 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt);.    **.    
1aa00 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
1aa10 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
1aa20 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64  cates that the d
1aa30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1aa40 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20  always well-.   
1aa50 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e   ** formed and n
1aa60 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54  ever corrupt.  T
1aa70 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61  his flag is clea
1aa80 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e  r by default, in
1aa90 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20  dicating that.  
1aaa0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1aab0 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61  les might have a
1aac0 72 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74  rbitrary corrupt
1aad0 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68  ion.  Setting th
1aae0 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20  e flag during.  
1aaf0 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75    ** testing cau
1ab00 73 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65  ses certain asse
1ab10 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1ab20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62  in the code to b
1ab30 65 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20  e activated.    
1ab40 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72  ** that demonstr
1ab50 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e  at invariants on
1ab60 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
1ab70 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20  abase files..   
1ab80 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ab90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56  ITE_TESTCTRL_NEV
1aba0 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20  ER_CORRUPT: {.  
1abb0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1abc0 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72  lConfig.neverCor
1abd0 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70  rupt = va_arg(ap
1abe0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1abf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
1ac00 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1ac10 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ac20 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f  E_TESTCTRL_VDBE_
1ac30 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62  COVERAGE, xCallb
1ac40 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a  ack, ptr);.    *
1ac50 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1ac60 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63   VDBE coverage c
1ac70 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
1ac80 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69   to xCallback wi
1ac90 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20  th context .    
1aca0 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a  ** pointer ptr..
1acb0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1acc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1acd0 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b  VDBE_COVERAGE: {
1ace0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
1acf0 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20  DBE_COVERAGE.   
1ad00 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
1ad10 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  (*branch_callbac
1ad20 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c  k)(void*,int,u8,
1ad30 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  u8);.      sqlit
1ad40 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1ad50 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f  VdbeBranch = va_
1ad60 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61  arg(ap,branch_ca
1ad70 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73  llback);.      s
1ad80 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ad90 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72  ig.pVdbeBranchAr
1ada0 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f  g = va_arg(ap,vo
1adb0 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  id*);.#endif.   
1adc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1add0 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
1ade0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1adf0 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
1ae00 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
1ae10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1ae20 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
1ae30 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
1ae40 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
1ae50 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
1ae60 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
1ae70 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
1ae80 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
1ae90 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
1aea0 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
1aeb0 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
1aec0 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
1aed0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
1aee0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1aef0 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
1af00 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
1af10 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
1af20 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
1af30 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
1af40 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
1af50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
1af60 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
1af70 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
1af80 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
1af90 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
1afa0 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
1afb0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1afc0 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
1afd0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
1afe0 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
1aff0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
1b000 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
1b010 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1b020 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
1b030 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
1b040 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
1b050 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
1b060 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1b070 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1b080 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
1b090 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  lename==0 ) retu
1b0a0 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  rn 0;.  zFilenam
1b0b0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
1b0c0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
1b0d0 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46  + 1;.  while( zF
1b0e0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
1b0f0 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70    int x = strcmp
1b100 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
1b110 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  am);.    zFilena
1b120 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
1b130 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
1b140 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d   + 1;.    if( x=
1b150 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c  =0 ) return zFil
1b160 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65  ename;.    zFile
1b170 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1b180 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1b190 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65  e) + 1;.  }.  re
1b1a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1b1b0 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61   Return a boolea
1b1c0 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  n value for a qu
1b1d0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1b1e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72  /.int sqlite3_ur
1b1f0 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  i_boolean(const 
1b200 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1b210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b220 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b  ram, int bDflt){
1b230 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b240 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1b250 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1b260 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62  me, zParam);.  b
1b270 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b  Dflt = bDflt!=0;
1b280 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71  .  return z ? sq
1b290 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
1b2a0 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c  z, bDflt) : bDfl
1b2b0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
1b2c0 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  rn a 64-bit inte
1b2d0 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ger value for a 
1b2e0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1b2f0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1b300 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  4 sqlite3_uri_in
1b310 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  t64(.  const cha
1b320 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1b330 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20   /* Filename as 
1b340 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20  passed to xOpen 
1b350 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b360 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f  *zParam,       /
1b370 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20  * URI parameter 
1b380 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69  sought */.  sqli
1b390 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20  te3_int64 bDflt 
1b3a0 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
1b3b0 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  if parameter is 
1b3c0 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  missing */.){.  
1b3d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1b3e0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1b3f0 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1b400 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69   zParam);.  sqli
1b410 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69  te3_int64 v;.  i
1b420 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 41  f( z && sqlite3A
1b430 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20 73 71 6c  toi64(z, &v, sql
1b440 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
1b450 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3d 3d 53   SQLITE_UTF8)==S
1b460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b470 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1b480 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1b490 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b4a0 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1b4b0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1b4c0 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1b4d0 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1b4e0 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1b4f0 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1b500 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1b510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1b520 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1b530 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1b540 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1b550 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1b560 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
1b570 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
1b580 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
1b590 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
1b5a0 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1b5b0 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44     return db->aD
1b5c0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a  b[i].pBt;.    }.
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 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
1b600 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1b610 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
1b620 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1b630 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
1b640 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
1b650 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
1b660 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1b670 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1b680 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69  tree *pBt = sqli
1b690 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1b6a0 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1b6b0 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1b6c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
1b6d0 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
1b6e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b6f0 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
1b700 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
1b710 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
1b720 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
1b730 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
1b740 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
1b750 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1b760 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
1b770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1b780 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1b790 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1b7a0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1b7b0 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1b7c0 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1b7d0 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70  treeIsReadonly(p
1b7e0 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a              Bt) : -1;.}.