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

Artifact dca921cb27c2221fe726a962b74aad19255a5bf4:


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 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1110: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1120: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1130: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
1140: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1150: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1160: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1170: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20  .  /* If SQLite 
1180: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c  is already compl
1190: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
11a0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  d, then this cal
11b0: 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  l.  ** to sqlite
11c0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73  3_initialize() s
11d0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70  hould be a no-op
11e0: 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74 69  .  But the initi
11f0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d  alization.  ** m
1200: 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e  ust be complete.
1210: 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74    So isInit must
1220: 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69   not be set unti
1230: 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20  l the very end. 
1240: 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74   ** of this rout
1250: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
1260: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1270: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
1280: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1290: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12a0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 7b 0a  ABLE_SQLLOG.  {.
12b0: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
12c0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
12d0: 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20 73  log(void);.    s
12e0: 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c  qlite3_init_sqll
12f0: 6f 67 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  og();.  }.#endif
1300: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1310: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1320: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1330: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1340: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1350: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1360: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1370: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1380: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1390: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
13a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
13b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
13c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
13d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
13e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
13f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1400: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1410: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1420: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1430: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1440: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1450: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1460: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1470: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1480: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1490: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
14a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
14b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
14c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
14d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
14e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
14f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1500: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1510: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1520: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1530: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1540: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1550: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1560: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1570: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1580: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1590: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
15a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
15b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
15c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
15d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
15e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
15f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1600: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1610: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1620: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1630: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1640: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1650: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1660: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1670: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1680: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1690: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16a0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
16b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16c0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
16d0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1700: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1710: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1720: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1730: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1750: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1760: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1770: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1780: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1790: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
17a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
17b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
17c0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
17d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
17e0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
17f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1800: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1820: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1830: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1840: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
1850: 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20  tMutex++;.  }.  
1860: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1870: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
1880: 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74   /* If rc is not
1890: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68   SQLITE_OK at th
18a0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65  is point, then e
18b0: 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63  ither the malloc
18c0: 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20  .  ** subsystem 
18d0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69  could not be ini
18e0: 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20  tialized or the 
18f0: 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f  system failed to
1900: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74   allocate.  ** t
1910: 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  he pInitMutex mu
1920: 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  tex. Return an e
1930: 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63  rror in either c
1940: 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  ase.  */.  if( r
1950: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1960: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20   }..  /* Do the 
1980: 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74  rest of the init
1990: 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72  ialization under
19a0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d   the recursive m
19b0: 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61  utex so.  ** tha
19c0: 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c  t we will be abl
19d0: 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75  e to handle recu
19e0: 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f  rsive calls into
19f0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  .  ** sqlite3_in
1a00: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65  itialize().  The
1a10: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1a20: 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74   normally come t
1a30: 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69  hrough.  ** sqli
1a40: 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68  te3_os_init() wh
1a50: 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71  en it invokes sq
1a60: 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1a70: 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a  er(), but other.
1a80: 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63    ** recursive c
1a90: 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20  alls might also 
1aa0: 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  be possible..  *
1ab0: 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
1ac0: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34  ATION-OF: R-0014
1ad0: 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61  0-37445 SQLite a
1ae0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72  utomatically ser
1af0: 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20  ializes calls.  
1b00: 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20  ** to the xInit 
1b10: 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78  method, so the x
1b20: 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64  Init method need
1b30: 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61   not be threadsa
1b40: 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  fe..  **.  ** Th
1b50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65  e following mute
1b60: 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c  x is what serial
1b70: 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74  izes access to t
1b80: 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65  he appdef pcache
1b90: 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68   xInit.  ** meth
1ba0: 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ods.  The sqlite
1bb0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
1bc0: 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20  .xInit() all is 
1bd0: 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a  embedded in the.
1be0: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
1bf0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
1c00: 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  lize()..  */.  s
1c10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1c20: 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  er(sqlite3Global
1c30: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1c40: 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
1c50: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1c60: 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74  Init==0 && sqlit
1c70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1c80: 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a  nProgress==0 ){.
1c90: 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20      FuncDefHash 
1ca0: 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c  *pHash = &GLOBAL
1cb0: 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71  (FuncDefHash, sq
1cc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74  lite3GlobalFunct
1cd0: 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  ions);.    sqlit
1ce0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1cf0: 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20  nProgress = 1;. 
1d00: 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c     memset(pHash,
1d10: 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74   0, sizeof(sqlit
1d20: 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  e3GlobalFunction
1d30: 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s));.    sqlite3
1d40: 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75  RegisterGlobalFu
1d50: 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69  nctions();.    i
1d60: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1d70: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1d80: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
1d90: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
1da0: 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  heInitialize();.
1db0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1dc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1de0: 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68  alConfig.isPCach
1df0: 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  eInit = 1;.     
1e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49   rc = sqlite3OsI
1e10: 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nit();.    }.   
1e20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1e40: 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53  te3PCacheBufferS
1e50: 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f  etup( sqlite3Glo
1e60: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c  balConfig.pPage,
1e70: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
1e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e90: 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47  szPage, sqlite3G
1ea0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
1eb0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1ec0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1ed0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Init = 1;.    }.
1ee0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1ef0: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
1f00: 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ss = 0;.  }.  sq
1f10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1f20: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
1f30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1f40: 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b  );..  /* Go back
1f50: 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74 69   under the stati
1f60: 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61  c mutex and clea
1f70: 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73 69  n up the recursi
1f80: 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f  ve.  ** mutex to
1f90: 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75   prevent a resou
1fa0: 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20  rce leak..  */. 
1fb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fc0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
1fd0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fe0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1ff0: 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69  ex--;.  if( sqli
2000: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2010: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30  nRefInitMutex<=0
2020: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2030: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2040: 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65  fig.nRefInitMute
2050: 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
2060: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73  te3_mutex_free(s
2070: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2080: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
2090: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20a0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
20b0: 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ex = 0;.  }.  sq
20c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20d0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
20e0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
20f0: 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79  is just a sanity
2100: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
2110: 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20  ure SQLite has. 
2120: 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65   ** been compile
2130: 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74  d correctly.  It
2140: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
2150: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20   run this code, 
2160: 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  but.  ** we don'
2170: 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74  t want to run it
2180: 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73   too often and s
2190: 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65  oak up CPU cycle
21a0: 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65  s for no.  ** re
21b0: 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e  ason.  So we run
21c0: 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20   it once during 
21d0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
21e0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
21f0: 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  BUG.#ifndef SQLI
2200: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
2210: 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73  _POINT.  /* This
2220: 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65   section of code
2230: 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22  's only "output"
2240: 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28 29   is via assert()
2250: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a   statements. */.
2260: 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54    if ( rc==SQLIT
2270: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20  E_OK ){.    u64 
2280: 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36  x = (((u64)1)<<6
2290: 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65  3)-1;.    double
22a0: 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73   y;.    assert(s
22b0: 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20  izeof(x)==8);.  
22c0: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
22d0: 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a  x)==sizeof(y));.
22e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26      memcpy(&y, &
22f0: 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72  x, 8);.    asser
2300: 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  t( sqlite3IsNaN(
2310: 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  y) );.  }.#endif
2320: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
2330: 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2340: 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75  ation steps requ
2350: 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51 4c  ested by the SQL
2360: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
2370: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   ** compile-time
2380: 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69   option..  */.#i
2390: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d  A_INIT.  if( rc=
23b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
23c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23d0: 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  g.isInit ){.    
23e0: 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41  int SQLITE_EXTRA
23f0: 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72  _INIT(const char
2400: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  *);.    rc = SQL
2410: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30  ITE_EXTRA_INIT(0
2420: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2430: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2440: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
2450: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
2460: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
2470: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
2480: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
2490: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
24a0: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
24b0: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
24c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
24d0: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
24e0: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
24f0: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
2500: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
2510: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2520: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
2530: 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61  e.  But it is sa
2540: 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  fe to invoke thi
2550: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20  s routine.** on 
2560: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61  when SQLite is a
2570: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
2580: 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  .  If SQLite is 
2590: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
25a0: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  n.** when this r
25b0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
25c0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
25d0: 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
25e0: 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74  ss no-op..*/.int
25f0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2600: 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73  n(void){.  if( s
2610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2620: 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  ig.isInit ){.#if
2630: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2640: 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f  _SHUTDOWN.    vo
2650: 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  id SQLITE_EXTRA_
2660: 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a  SHUTDOWN(void);.
2670: 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41      SQLITE_EXTRA
2680: 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e  _SHUTDOWN();.#en
2690: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
26a0: 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71  os_end();.    sq
26b0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f  lite3_reset_auto
26c0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20  _extension();.  
26d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
26e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30  onfig.isInit = 0
26f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2700: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2710: 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a  isPCacheInit ){.
2720: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2730: 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20  eShutdown();.   
2740: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2750: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2760: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2770: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2780: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2790: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
27a0: 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20  MallocEnd();.   
27b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
27c0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
27d0: 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t = 0;..#ifndef 
27e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54  SQLITE_OMIT_SHUT
27f0: 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53  DOWN_DIRECTORIES
2800: 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70  .    /* The heap
2810: 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e   subsystem has n
2820: 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e  ow been shutdown
2830: 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65   and these value
2840: 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20  s are supposed. 
2850: 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c     ** to be NULL
2860: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
2870: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62 74  ory that was obt
2880: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2890: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20  e3_malloc(),.   
28a0: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
28b0: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
28c0: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
28d0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
28e0: 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76  e these.    ** v
28f0: 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66  alues cannot ref
2900: 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72  er to heap memor
2910: 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  y that was just 
2920: 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
2930: 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70   the.    ** heap
2940: 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20 73   subsystem was s
2950: 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69  hutdown.  This i
2960: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74  s only done if t
2970: 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20  he current call 
2980: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  to.    ** this f
2990: 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64  unction resulted
29a0: 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75 62   in the heap sub
29b0: 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20  system actually 
29c0: 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a  being shutdown..
29d0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
29e0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
29f0: 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
2a00: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2a10: 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 0;.#endif.  
2a20: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2a30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2a40: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2a50: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2a60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2a70: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2a80: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
2a90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aa0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2ab0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
2ac0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
2ad0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2ae0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2af0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2b00: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2b10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2b20: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2b30: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2b40: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2b50: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2b60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2b70: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2b80: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
2b90: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
2ba0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
2bb0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
2bc0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
2bd0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2be0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2bf0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2c00: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
2c10: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2c20: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
2c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
2c40: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
2c50: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
2c60: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
2c70: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
2c80: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
2c90: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
2ca0: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
2cb0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2cc0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
2cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2ce0: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
2cf0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
2d00: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
2d10: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
2d20: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2d30: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
2d40: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
2d50: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
2d60: 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66  ile. .    */.#if
2d70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2d80: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
2d90: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2da0: 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
2db0: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
2dc0: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
2dd0: 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d  /* Disable all m
2de0: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2df0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2e00: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2e10: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
2e20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2e30: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2e40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e50: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2e60: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
2e70: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2e80: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e   Disable mutexin
2e90: 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  g of database co
2ea0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
2eb0: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74     /* Enable mut
2ec0: 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61  exing of core da
2ed0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
2ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2f00: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2f10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f20: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2f30: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2f50: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2f60: 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ERIALIZED: {.   
2f70: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c     /* Enable all
2f80: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
2f90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2fa0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2fb0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2fc0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fd0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
2fe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ff0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3000: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58  ITE_CONFIG_MUTEX
3010: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
3020: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
3030: 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ive mutex implem
3040: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3050: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3060: 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76  onfig.mutex = *v
3070: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3080: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a  3_mutex_methods*
3090: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
30a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
30b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
30c0: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
30d0: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
30e0: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
30f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
3100: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3110: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
3120: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
3130: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3140: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
3150: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3160: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3170: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3180: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
3190: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
31a0: 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  ve malloc implem
31b0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
31c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
31d0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72  onfig.m = *va_ar
31e0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
31f0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  m_methods*);.   
3200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3210: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3220: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
3230: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
3240: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
3250: 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65  t malloc() imple
3260: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
3270: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3280: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
3290: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
32a0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
32b0: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
32c0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
32d0: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
32e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
32f0: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
3300: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3310: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
3320: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
3330: 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  /* Enable or dis
3340: 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  able the malloc 
3350: 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f  status collectio
3360: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
3370: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3380: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
3390: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
33a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
33b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
33c0: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a  NFIG_SCRATCH: {.
33d0: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
33e0: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
33f0: 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73  scratch memory s
3400: 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  pace */.      sq
3410: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3420: 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.pScratch = va_
3430: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3450: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
3460: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
3470: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3480: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3490: 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .nScratch = va_a
34a0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
34b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
34c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
34d0: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
34e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
34f0: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
3500: 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d  for page cache m
3510: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3530: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d  alConfig.pPage =
3540: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3550: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
3570: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
3580: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3590: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
35a0: 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67  g.nPage = va_arg
35b0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
35c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
35d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
35e0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
35f0: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3600: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3610: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3620: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3630: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3640: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3650: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3660: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3690: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
36a0: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
36b0: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
36c0: 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c   page cache impl
36d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
36e0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
36f0: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20  lConfig.pcache2 
3700: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
3710: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3720: 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62  hods2*);.      b
3730: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3740: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3750: 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b  IG_GETPCACHE2: {
3760: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3770: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3780: 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20  cache2.xInit==0 
3790: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
37a0: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
37b0: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
37c0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
37d0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
37e0: 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69  ethods2*) = sqli
37f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3800: 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62  pcache2;.      b
3810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
3820: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3830: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
3840: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3850: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3860: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
3870: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
3880: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
3890: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
38a0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
38b0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
38c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
38d0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
38e0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
38f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3900: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
3910: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3920: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3930: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3940: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3950: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
3980: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3990: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
39a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
39b0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
39c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
39d0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
39e0: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
39f0: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
3a00: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
3a10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3a20: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
3a30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
3a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3a50: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
3a60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
3a70: 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72  the heap pointer
3a80: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
3a90: 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f  estore the mallo
3aa0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
3ab0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
3ac0: 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72   to NULL pointer
3ad0: 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c  s too.  This wil
3ae0: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c  l cause the mall
3af0: 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20  oc to go.       
3b00: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
3b10: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
3b20: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
3b30: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
3b40: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   is.        ** r
3b50: 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  un..        */. 
3b60: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
3b70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3b80: 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ig.m, 0, sizeof(
3b90: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3ba0: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
3bb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
3bc0: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
3bd0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
3be0: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
3bf0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
3c00: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
3c10: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
3c20: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
3c30: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
3c40: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
3c50: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
3c60: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
3c70: 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
3c80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3c90: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
3ca0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cb0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
3cc0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
3cd0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3ce0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
3cf0: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
3d00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3d10: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
3d20: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
3d30: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
3d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3d50: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3d60: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
3d70: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
3d80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3d90: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
3da0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3dc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
3dd0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3de0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3e00: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
3e10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3e20: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69  e logger funccti
3e30: 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74  on and its first
3e40: 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a   argument..    *
3e50: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73  * The default is
3e60: 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20   NULL.  Logging 
3e70: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
3e80: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
3e90: 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  ter is.    ** NU
3ea0: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
3eb0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3ec0: 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f  G_LOG: {.      /
3ed0: 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
3ee0: 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
3ef0: 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
3f00: 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
3f10: 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
3f20: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
3f30: 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
3f40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3f50: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3f60: 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  (ap, void(*)(voi
3f70: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
3f80: 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  r*));.      */. 
3f90: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
3fa0: 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  d(*LOGFUNC_t)(vo
3fb0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3fc0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
3fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3fe0: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
3ff0: 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20  , LOGFUNC_t);.  
4000: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4010: 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20  lConfig.pLogArg 
4020: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4030: 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d*);.      break
4040: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
4050: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4060: 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  URI: {.      sql
4070: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4080: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
4090: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
40a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
40b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
40c0: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
40d0: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
40e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
40f0: 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
4100: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4110: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
4120: 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
4130: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
4140: 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c  LOG.    case SQL
4150: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
4160: 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  G: {.      typed
4170: 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46  ef void(*SQLLOGF
4180: 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71  UNC_t)(void*, sq
4190: 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
41a0: 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  ar*, int);.     
41b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
41c0: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76  nfig.xSqllog = v
41d0: 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47  a_arg(ap, SQLLOG
41e0: 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73  FUNC_t);.      s
41f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4200: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20  ig.pSqllogArg = 
4210: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20  va_arg(ap, void 
4220: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4230: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4240: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4250: 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a  ONFIG_MMAP_SIZE:
4260: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4270: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d 20  _int64 szMmap = 
4280: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4290: 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20  e3_int64);.     
42a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
42b0: 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61  xMmap = va_arg(a
42c0: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
42d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 4d  );.      if( mxM
42e0: 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e  map<0 || mxMmap>
42f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4300: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
4310: 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  mxMmap = SQLITE_
4320: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20  MAX_MMAP_SIZE;. 
4330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4340: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4350: 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70  .mxMmap = mxMmap
4360: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
4370: 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20  ap<0 ) szMmap = 
4380: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
4390: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
43a0: 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61  if( szMmap>mxMma
43b0: 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d  p) szMmap = mxMm
43c0: 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ap;.      sqlite
43d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
43e0: 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20  Mmap = szMmap;. 
43f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4400: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
4410: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
4420: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
4430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4440: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
4450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4460: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
4470: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
4480: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
4490: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
44a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
44b0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
44c0: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
44d0: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
44e0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
44f0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
4500: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
4510: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
4520: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
4530: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
4540: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
4550: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
4560: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
4570: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
4580: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
4590: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
45a0: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
45b0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
45c0: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
45d0: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
45e0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
45f0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
4600: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
4610: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
4620: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
4630: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
4640: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
4650: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
4660: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76  z, int cnt){.  v
4670: 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69  oid *pStart;.  i
4680: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4690: 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  .nOut ){.    ret
46a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
46b0: 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61  .  }.  /* Free a
46c0: 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b  ny existing look
46d0: 61 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72  aside buffer for
46e0: 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66   this handle bef
46f0: 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ore.  ** allocat
4700: 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f  ing a new one so
4710: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74   we don't have t
4720: 6f 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72  o have space for
4730: 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74   .  ** both at t
4740: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
4750: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
4760: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
4770: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4780: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
4790: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
47a0: 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66    /* The size of
47b0: 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f   a lookaside slo
47c0: 74 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57  t after ROUNDDOW
47d0: 4e 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  N8 needs to be l
47e0: 61 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  arger.  ** than 
47f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  a pointer to be 
4800: 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73  useful..  */.  s
4810: 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73  z = ROUNDDOWN8(s
4820: 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  z);  /* IMP: R-3
4830: 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20  3038-09382 */.  
4840: 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a  if( sz<=(int)siz
4850: 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f  eof(LookasideSlo
4860: 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20  t*) ) sz = 0;.  
4870: 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20  if( cnt<0 ) cnt 
4880: 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30  = 0;.  if( sz==0
4890: 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   || cnt==0 ){.  
48a0: 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53    sz = 0;.    pS
48b0: 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tart = 0;.  }els
48c0: 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b  e if( pBuf==0 ){
48d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
48e0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
48f0: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71  .    pStart = sq
4900: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a  lite3Malloc( sz*
4910: 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  cnt );  /* IMP: 
4920: 52 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f  R-61949-35727 */
4930: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
4940: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
4950: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20     if( pStart ) 
4960: 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  cnt = sqlite3Mal
4970: 6c 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f  locSize(pStart)/
4980: 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sz;.  }else{.   
4990: 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a   pStart = pBuf;.
49a0: 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73    }.  db->lookas
49b0: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74  ide.pStart = pSt
49c0: 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  art;.  db->looka
49d0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
49e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
49f0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
4a00: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
4a10: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
4a20: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
4a30: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
4a40: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
4a50: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
4a60: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4a70: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
4a80: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
4a90: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
4aa0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
4ab0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
4ac0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
4ad0: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b  aside.pFree = p;
4ae0: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
4af0: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
4b00: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
4b10: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4b20: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
4b30: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
4b40: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  nabled = 1;.    
4b50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
4b60: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
4b70: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
4b80: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4b90: 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  de.pEnd = 0;.   
4ba0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4bb0: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20  Enabled = 0;.   
4bc0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4bd0: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
4be0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4bf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
4c00: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
4c10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4c20: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
4c30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
4c40: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
4c50: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
4c60: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
4c70: 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f   db->mutex;.}../
4c80: 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20  *.** Free up as 
4c90: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77  much memory as w
4ca0: 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67  e can from the g
4cb0: 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  iven database.**
4cc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4cd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  int sqlite3_db_r
4ce0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71  elease_memory(sq
4cf0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
4d00: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  t i;.  sqlite3_m
4d10: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
4d20: 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
4d30: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
4d40: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4d50: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4d60: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
4d70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
4d80: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
4d90: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
4da0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
4db0: 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
4dc0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
4dd0: 68 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20  hrink(pPager);. 
4de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4df0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
4e00: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
4e10: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
4e20: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
4e30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4e40: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
4e50: 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61  n settings for a
4e60: 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74  n individual dat
4e70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
4e80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
4e90: 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65  db_config(sqlite
4ea0: 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e  3 *db, int op, .
4eb0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
4ec0: 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  p;.  int rc;.  v
4ed0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
4ee0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
4ef0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f00: 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  _DBCONFIG_LOOKAS
4f10: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  IDE: {.      voi
4f20: 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67  d *pBuf = va_arg
4f30: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20  (ap, void*); /* 
4f40: 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39  IMP: R-26835-109
4f50: 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  64 */.      int 
4f60: 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
4f70: 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49  int);       /* I
4f80: 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39  MP: R-47871-2599
4f90: 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  4 */.      int c
4fa0: 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nt = va_arg(ap, 
4fb0: 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d  int);      /* IM
4fc0: 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36  P: R-04460-53386
4fd0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
4fe0: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
4ff0: 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29  , pBuf, sz, cnt)
5000: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5010: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
5020: 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
5030: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
5040: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20          int op; 
5050: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
5060: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  de */.        u3
5070: 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61  2 mask;    /* Ma
5080: 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e  sk of the bit in
5090: 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74   sqlite3.flags t
50a0: 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20  o set/clear */. 
50b0: 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d       } aFlagOp[]
50c0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53   = {.        { S
50d0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
50e0: 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53  NABLE_FKEY,    S
50f0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
5100: 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  s    },.        
5110: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
5120: 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
5130: 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  , SQLITE_EnableT
5140: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
5150: 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   };.      unsign
5160: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20  ed int i;.      
5170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5180: 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37  R; /* IMP: R-427
5190: 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20  90-23372 */.    
51a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
51b0: 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b  aySize(aFlagOp);
51c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
51d0: 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70  f( aFlagOp[i].op
51e0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ==op ){.        
51f0: 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61    int onoff = va
5200: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5210: 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52           int *pR
5220: 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  es = va_arg(ap, 
5230: 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20  int*);.         
5240: 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20   int oldFlags = 
5250: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  db->flags;.     
5260: 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30       if( onoff>0
5270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5280: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c  db->flags |= aFl
5290: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
52a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
52b0: 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20  ( onoff==0 ){.  
52c0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
52d0: 61 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b  ags &= ~aFlagOp[
52e0: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
52f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
5300: 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d  f( oldFlags!=db-
5310: 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  >flags ){.      
5320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5330: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
5340: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  ments(db);.     
5350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5360: 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20   if( pRes ){.   
5370: 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
5380: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46   (db->flags & aF
5390: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d  lagOp[i].mask)!=
53a0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
53b0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
53c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
53d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
53e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
53f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5400: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
5410: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5420: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5430: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
5440: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
5450: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
5460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
5470: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
5480: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
5490: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
54a0: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
54b0: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
54c0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
54d0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
54e0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
54f0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
5500: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
5510: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
5520: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
5530: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
5540: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
5550: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
5560: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
5570: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
5580: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
5590: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
55a0: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
55b0: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
55c0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
55d0: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
55e0: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
55f0: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
5600: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
5610: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
5620: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
5630: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
5640: 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d   nKey2;.  rc = m
5650: 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
5660: 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
5670: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
5680: 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61  adFlag.     && a
5690: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
56a0: 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31  )pKey1)+n, nKey1
56b0: 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  -n).     && allS
56c0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
56d0: 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29  ey2)+n, nKey2-n)
56e0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
56f0: 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e   Leave rc unchan
5700: 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20  ged at 0 */.    
5710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
5720: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
5730: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5740: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5750: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
5760: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
5770: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
5780: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
5790: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
57a0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
57b0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
57c0: 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d  dependant.** com
57d0: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
57e0: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
57f0: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
5800: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
5810: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
5820: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
5830: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
5840: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
5850: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
5860: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
5870: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
5880: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
5890: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
58a0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
58b0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
58c0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
58d0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
58e0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
58f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5900: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
5910: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
5920: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
5930: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
5940: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
5950: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
5960: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
5970: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
5980: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
5990: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
59a0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
59b0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
59c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
59d0: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
59e0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
59f0: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
5a00: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
5a10: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
5a20: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
5a30: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
5a40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5a50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
5a60: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
5a70: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
5a80: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
5a90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
5aa0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
5ab0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
5ac0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
5ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5ae0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
5af0: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
5b00: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
5b10: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
5b20: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
5b30: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
5b40: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  {.  return db->n
5b50: 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a  TotalChange;.}..
5b60: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
5b70: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
5b80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
5b90: 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20  nly manipulates 
5ba0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a  fields of the.**
5bb0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
5bc0: 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73   object, it does
5bd0: 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73   not close any s
5be0: 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d  avepoints that m
5bf0: 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74  ay be open.** at
5c00: 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65   the b-tree/page
5c10: 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64  r level..*/.void
5c20: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
5c30: 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20  epoints(sqlite3 
5c40: 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64  *db){.  while( d
5c50: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  b->pSavepoint ){
5c60: 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  .    Savepoint *
5c70: 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65  pTmp = db->pSave
5c80: 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70  point;.    db->p
5c90: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
5ca0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
5cb0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5cc0: 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Tmp);.  }.  db->
5cd0: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
5ce0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
5cf0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72   = 0;.  db->isTr
5d00: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
5d10: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
5d20: 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   Invoke the dest
5d30: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
5d40: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5d50: 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e  FuncDef p, if an
5d60: 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66  y. Except,.** if
5d70: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
5d80: 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68   last copy of th
5d90: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e  e function, do n
5da0: 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75  ot invoke it. Mu
5db0: 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73  ltiple.** copies
5dc0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e   of a single fun
5dd0: 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65  ction are create
5de0: 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75  d when create_fu
5df0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c  nction() is call
5e00: 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  ed.** with SQLIT
5e10: 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63  E_ANY as the enc
5e20: 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  oding..*/.static
5e30: 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65   void functionDe
5e40: 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64  stroy(sqlite3 *d
5e50: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a  b, FuncDef *p){.
5e60: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
5e70: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20   *pDestructor = 
5e80: 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a  p->pDestructor;.
5e90: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
5ea0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
5eb0: 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ctor->nRef--;.  
5ec0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
5ed0: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
5ee0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
5ef0: 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72  >xDestroy(pDestr
5f00: 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61  uctor->pUserData
5f10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5f20: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74  DbFree(db, pDest
5f30: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
5f40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63   }.}../*.** Disc
5f50: 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74  onnect all sqlit
5f60: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20  e3_vtab objects 
5f70: 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64  that belong to d
5f80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5f90: 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69  on.** db. This i
5fa0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62  s called when db
5fb0: 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64   is being closed
5fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5fd0: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
5fe0: 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ab(sqlite3 *db){
5ff0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6000: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6010: 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  E.  int i;.  sql
6020: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
6030: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
6040: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
6050: 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ){.    Schema *p
6060: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
6070: 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [i].pSchema;.   
6080: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
6090: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
60a0: 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20   HashElem *p;.  
60b0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
60c0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
60d0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b  ma->tblHash); p;
60e0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
60f0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(p)){.        T
6100: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61  able *pTab = (Ta
6110: 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ble *)sqliteHash
6120: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20  Data(p);.       
6130: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
6140: 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74  Tab) ) sqlite3Vt
6150: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
6160: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a   pTab);.      }.
6170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
6180: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
6190: 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  (db);.#else.  UN
61a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
61b0: 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  b);.#endif.}../*
61c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
61d0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
61e0: 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e  ection db has un
61f0: 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72  finalized prepar
6200: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ed.** statements
6210: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73   or unfinished s
6220: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
6230: 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74  jects.  .*/.stat
6240: 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  ic int connectio
6250: 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20  nIsBusy(sqlite3 
6260: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  *db){.  int j;. 
6270: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6280: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
6290: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
62a0: 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75  db->pVdbe ) retu
62b0: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  rn 1;.  for(j=0;
62c0: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
62d0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
62e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42   = db->aDb[j].pB
62f0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
6300: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
6310: 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20  InBackup(pBt) ) 
6320: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
6330: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6340: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73  ** Close an exis
6350: 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61  ting SQLite data
6360: 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  base.*/.static i
6370: 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28  nt sqlite3Close(
6380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6390: 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20   forceZombie){. 
63a0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
63d0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
63e0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
63f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6400: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
6410: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
6420: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6430: 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20  x);..  /* Force 
6440: 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c  xDisconnect call
6450: 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  s on all virtual
6460: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73   tables */.  dis
6470: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64  connectAllVtab(d
6480: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  b);..  /* If a t
6490: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
64a0: 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  en, the disconne
64b0: 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c  ctAllVtab() call
64c0: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
64d0: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
64e0: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
64f0: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
6500: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
6510: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
6520: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
6530: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
6540: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6550: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
6560: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
6570: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
6580: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
6590: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
65a0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
65b0: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
65c0: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
65d0: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
65e0: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
65f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
6600: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
6610: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
6620: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
6630: 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
6640: 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  r (sqlite3_close
6650: 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20  () behavior) is 
6660: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
6670: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
6680: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
6690: 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69   not be closed i
66a0: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
66b0: 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d  .  if( !forceZom
66c0: 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f  bie && connectio
66d0: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
66e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
66f0: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
6700: 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73   "unable to clos
6710: 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c  e due to unfinal
6720: 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22 73  ized ".       "s
6730: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
6740: 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73 22  inished backups"
6750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
6760: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
6770: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
6780: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6790: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
67a0: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
67b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
67c0: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
67d0: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  g ){.    /* Clos
67e0: 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20  ing the handle. 
67f0: 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
6800: 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20 76   is passed the v
6810: 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73  alue 2. */.    s
6820: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
6830: 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74  ig.xSqllog(sqlit
6840: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
6850: 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30  SqllogArg, db, 0
6860: 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 2);.  }.#endif
6870: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
6880: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  he connection in
6890: 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20  to a zombie and 
68a0: 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20  then close it.. 
68b0: 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   */.  db->magic 
68c0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  = SQLITE_MAGIC_Z
68d0: 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33  OMBIE;.  sqlite3
68e0: 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f  LeaveMutexAndClo
68f0: 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20  seZombie(db);.  
6900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76  ;.}../*.** Two v
6920: 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65  ariations on the
6930: 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63   public interfac
6940: 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20  e for closing a 
6950: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
6960: 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69  ection. The sqli
6970: 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73  te3_close() vers
6980: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
6990: 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c  TE_BUSY and.** l
69a0: 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63  eaves the connec
69b0: 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74  tion option if t
69c0: 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c  here are unfinal
69d0: 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a  ized prepared.**
69e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75   statements or u
69f0: 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65  nfinished sqlite
6a00: 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20  3_backups.  The 
6a10: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
6a20: 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f  ().** version fo
6a30: 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  rces the connect
6a40: 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ion to become a 
6a50: 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65 20  zombie if there 
6a60: 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20  are.** unclosed 
6a70: 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61  resources, and a
6a80: 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c  rranges for deal
6a90: 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68  location when th
6aa0: 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72  e last.** prepar
6ab0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  e statement or s
6ac0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c  qlite3_backup cl
6ad0: 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oses..*/.int sql
6ae0: 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74  ite3_close(sqlit
6af0: 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20  e3 *db){ return 
6b00: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c  sqlite3Close(db,
6b10: 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0); }.int sqlite
6b20: 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74  3_close_v2(sqlit
6b30: 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20  e3 *db){ return 
6b40: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c  sqlite3Close(db,
6b50: 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  1); }.../*.** Cl
6b60: 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  ose the mutex on
6b70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6b80: 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46  tion db..**.** F
6b90: 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64  urthermore, if d
6ba0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6bb0: 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69  on db is a zombi
6bc0: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
6bd0: 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65  there.** has bee
6be0: 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  n a prior call t
6bf0: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  o sqlite3_close(
6c00: 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63  db) or sqlite3_c
6c10: 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64  lose_v2(db)) and
6c20: 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65  .** every sqlite
6c30: 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62  3_stmt has now b
6c40: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
6c50: 64 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  d every sqlite3_
6c60: 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69  backup has.** fi
6c70: 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65  nished, then fre
6c80: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
6c90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6ca0: 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f  LeaveMutexAndClo
6cb0: 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33  seZombie(sqlite3
6cc0: 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65   *db){.  HashEle
6cd0: 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20  m *i;           
6ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
6cf0: 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20   table iterator 
6d00: 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f  */.  int j;..  /
6d10: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
6d20: 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74  utstanding sqlit
6d30: 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74  e3_stmt or sqlit
6d40: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6d50: 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65  s.  ** or if the
6d60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
6d70: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f  not yet been clo
6d80: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  sed by sqlite3_c
6d90: 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20  lose_v2(),.  ** 
6da0: 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20  then just leave 
6db0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65  the mutex and re
6dc0: 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
6dd0: 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49   db->magic!=SQLI
6de0: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20  TE_MAGIC_ZOMBIE 
6df0: 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  || connectionIsB
6e00: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6e10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6e20: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6e30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
6e40: 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
6e50: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
6e60: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64  means that the d
6e70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6e80: 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73  on has.  ** clos
6e90: 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  ed all sqlite3_s
6ea0: 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  tmt and sqlite3_
6eb0: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61  backup objects a
6ec0: 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a  nd has been.  **
6ed0: 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
6ee0: 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e  e3_close (meanin
6ef0: 67 20 74 68 61 74 20 69 74 20 69 73 20 61 20 7a  g that it is a z
6f00: 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f  ombie).  Therefo
6f10: 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61  re,.  ** go ahea
6f20: 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72  d and free all r
6f30: 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a  esources..  */..
6f40: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75    /* Free any ou
6f50: 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f  tstanding Savepo
6f60: 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20  int structures. 
6f70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  */.  sqlite3Clos
6f80: 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
6f90: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
6fa0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6fb0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a  tions */.  for(j
6fc0: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
6fd0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
6fe0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
6ff0: 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[j];.    if( p
7000: 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Db->pBt ){.     
7010: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
7020: 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  se(pDb->pBt);.  
7030: 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30      pDb->pBt = 0
7040: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31  ;.      if( j!=1
7050: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
7060: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
7070: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7080: 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54    /* Clear the T
7090: 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72  EMP schema separ
70a0: 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a  ately and last *
70b0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /.  if( db->aDb[
70c0: 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
70d0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
70e0: 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  lear(db->aDb[1].
70f0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
7100: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
7110: 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  kList(db);..  /*
7120: 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72   Free up the arr
7130: 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  ay of auxiliary 
7140: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73  databases */.  s
7150: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
7160: 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b  tabaseArray(db);
7170: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
7180: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
7190: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
71a0: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20  aDbStatic );..  
71b0: 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65  /* Tell the code
71c0: 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61   in notify.c tha
71d0: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
71e0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73   no longer holds
71f0: 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20   any.  ** locks 
7200: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  and does not req
7210: 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72  uire any further
7220: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
7230: 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
7240: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
7250: 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20  onClosed(db);.. 
7260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
7270: 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e  ySize(db->aFunc.
7280: 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75  a); j++){.    Fu
7290: 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70  ncDef *pNext, *p
72a0: 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f  Hash, *p;.    fo
72b0: 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b  r(p=db->aFunc.a[
72c0: 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b  j]; p; p=pHash){
72d0: 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d 20 70  .      pHash = p
72e0: 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77  ->pHash;.      w
72f0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20  hile( p ){.     
7300: 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72     functionDestr
7310: 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  oy(db, p);.     
7320: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
7330: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
7340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7350: 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  );.        p = p
7360: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
7370: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
7380: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
7390: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
73a0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
73b0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c  ext(i)){.    Col
73c0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
73d0: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
73e0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
73f0: 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65  /* Invoke any de
7400: 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74  structors regist
7410: 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69  ered for collati
7420: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72  on sequence user
7430: 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f   data. */.    fo
7440: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
7450: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  {.      if( pCol
7460: 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20  l[j].xDel ){.   
7470: 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44       pColl[j].xD
7480: 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65  el(pColl[j].pUse
7490: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
74a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
74b0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a  ree(db, pColl);.
74c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
74d0: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c  hClear(&db->aCol
74e0: 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
74f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7500: 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d  ALTABLE.  for(i=
7510: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
7520: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69  &db->aModule); i
7530: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
7540: 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(i)){.    Modu
7550: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
7560: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
7570: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
7580: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29  pMod->xDestroy )
7590: 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44  {.      pMod->xD
75a0: 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75  estroy(pMod->pAu
75b0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  x);.    }.    sq
75c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
75d0: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
75e0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
75f0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
7600: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
7610: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
7620: 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  K, 0); /* Deallo
7630: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
7640: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
7650: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72  */.  if( db->pEr
7660: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
7670: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
7680: 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rr);.  }.  sqlit
7690: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
76a0: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
76b0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
76c0: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
76d0: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
76e0: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
76f0: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
7700: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
7710: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
7720: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
7730: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
7740: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
7750: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
7760: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
7770: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
7780: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
7790: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
77a0: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
77b0: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
77c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
77d0: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
77e0: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
77f0: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
7800: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
7810: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7820: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
7830: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
7840: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7850: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
7860: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
7870: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
7880: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
7890: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
78a0: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
78b0: 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f  de.nOut==0 );  /
78c0: 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f  * Fails on a loo
78d0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65  kaside memory le
78e0: 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ak */.  if( db->
78f0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
7900: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
7910: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
7920: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
7930: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
7940: 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(db);.}../*.** 
7950: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
7960: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66  abase files.  If
7970: 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
7980: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
7990: 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  .** any open cur
79a0: 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
79b0: 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20  ated ("tripped" 
79c0: 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e  - as in "trippin
79d0: 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62  g a circuit.** b
79e0: 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64  reaker") and mad
79f0: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70  e to return trip
7a00: 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72  Code if there ar
7a10: 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a  e any further.**
7a20: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65   attempts to use
7a30: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f   that cursor..*/
7a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
7a50: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
7a60: 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f   *db, int tripCo
7a70: 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  de){.  int i;.  
7a80: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
7a90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7aa0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
7ab0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
7ac0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
7ad0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  Malloc();.  for(
7ae0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7af0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
7b00: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
7b10: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
7b20: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7b30: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7b40: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
7b50: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
7b60: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7b70: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
7b80: 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
7b90: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69      db->aDb[i].i
7ba0: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20  nTrans = 0;.    
7bb0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
7bc0: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
7bd0: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
7be0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
7bf0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53  if( (db->flags&S
7c00: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
7c10: 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  ges)!=0 && db->i
7c20: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
7c30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
7c40: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
7c50: 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ts(db);.    sqli
7c60: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
7c70: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
7c80: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e  b);.  }..  /* An
7c90: 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  y deferred const
7ca0: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
7cb0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
7cc0: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62  esolved. */.  db
7cd0: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
7ce0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  = 0;..  /* If on
7cf0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
7d00: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
7d10: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
7d20: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
7d30: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
7d40: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
7d50: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
7d60: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
7d70: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
7d80: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
7d90: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
7da0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
7db0: 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74  atic string cont
7dc0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
7dd0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
7de0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
7df0: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ** specified in 
7e00: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
7e10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
7e20: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
7e30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
7e40: 54 29 20 7c 7c 20 5c 0a 20 20 20 20 64 65 66 69  T) || \.    defi
7e50: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
7e60: 5f 4f 53 5f 54 52 41 43 45 29 0a 63 6f 6e 73 74  _OS_TRACE).const
7e70: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
7e80: 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20  rName(int rc){. 
7e90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7ea0: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
7eb0: 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20   origRc = rc;.  
7ec0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20  for(i=0; i<2 && 
7ed0: 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72  zName==0; i++, r
7ee0: 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20  c &= 0xff){.    
7ef0: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
7f00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7f10: 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK:             
7f20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
7f30: 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20  ITE_OK";        
7f40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7f50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
7f60: 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20  _ERROR:         
7f70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
7f80: 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20  LITE_ERROR";    
7f90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7fa0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
7fb0: 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20  E_INTERNAL:     
7fc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
7fd0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b  QLITE_INTERNAL";
7fe0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
7ff0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8000: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20  TE_PERM:        
8010: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8020: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
8030: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8040: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8050: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
8060: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8070: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20  "SQLITE_ABORT"; 
8080: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8090: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
80a0: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
80b0: 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ACK:     zName =
80c0: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52   "SQLITE_ABORT_R
80d0: 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65  OLLBACK";    bre
80e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
80f0: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
8100: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8110: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
8130: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8140: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f  SQLITE_BUSY_RECO
8150: 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  VERY:      zName
8160: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
8170: 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62  RECOVERY";     b
8180: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8190: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20   SQLITE_LOCKED: 
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
81b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b  e = "SQLITE_LOCK
81c0: 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ED";            
81d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
81e0: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  e SQLITE_LOCKED_
81f0: 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61  SHAREDCACHE: zNa
8200: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
8210: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 22  KED_SHAREDCACHE"
8220: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
8230: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
8250: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
8260: 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  MEM";           
8270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8280: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
8290: 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NLY:           z
82a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
82b0: 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20  EADONLY";       
82c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
82d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
82e0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  ONLY_RECOVERY:  
82f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8300: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
8310: 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Y"; break;.     
8320: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
8330: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20  DONLY_CANTLOCK: 
8340: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8350: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
8360: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
8370: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
8380: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a  ADONLY_ROLLBACK:
8390: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
83a0: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
83b0: 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACK"; break;.   
83c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
83d0: 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20  NTERRUPT:       
83e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
83f0: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
8400: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8410: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8420: 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20  IOERR:          
8430: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8440: 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20  ITE_IOERR";     
8450: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8460: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8470: 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20  _IOERR_READ:    
8480: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8490: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22  LITE_IOERR_READ"
84a0: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
84b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
84c0: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
84d0: 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  AD:   zName = "S
84e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
84f0: 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b  T_READ";  break;
8500: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8510: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20  TE_IOERR_WRITE: 
8520: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8530: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
8540: 54 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  TE";       break
8550: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8560: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a  ITE_IOERR_FSYNC:
8570: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8580: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
8590: 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61  YNC";       brea
85a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
85b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
85c0: 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  SYNC:    zName =
85d0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
85e0: 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65  IR_FSYNC";   bre
85f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8600: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
8610: 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20  CATE:     zName 
8620: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8630: 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72  TRUNCATE";    br
8640: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8650: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
8660: 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  AT:        zName
8670: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8680: 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62  _FSTAT";       b
8690: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
86a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
86b0: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
86c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
86d0: 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_UNLOCK";      
86e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
86f0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
8700: 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61  DLOCK:       zNa
8710: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8720: 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20  RR_RDLOCK";     
8730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8740: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8750: 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e  DELETE:       zN
8760: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8770: 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20  ERR_DELETE";    
8780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8790: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
87a0: 5f 42 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 7a  _BLOCKED:      z
87b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
87c0: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 22 3b 20 20  OERR_BLOCKED";  
87d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
87f0: 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  R_NOMEM:        
8800: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8810: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20  IOERR_NOMEM";   
8820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8830: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8840: 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20  RR_ACCESS:      
8850: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8860: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20  _IOERR_ACCESS"; 
8870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8880: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8890: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
88a0: 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  DLOCK:.         
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
88d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
88e0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b  CKRESERVEDLOCK";
88f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8900: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8910: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  LOCK:         zN
8920: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8930: 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20  ERR_LOCK";      
8940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8950: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8960: 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a  _CLOSE:        z
8970: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8980: 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20  OERR_CLOSE";    
8990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
89a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
89b0: 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20  R_DIR_CLOSE:    
89c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
89d0: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22  IOERR_DIR_CLOSE"
89e0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
89f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8a00: 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20  RR_SHMOPEN:     
8a10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8a20: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b  _IOERR_SHMOPEN";
8a30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8a50: 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20  ERR_SHMSIZE:    
8a60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8a70: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22  E_IOERR_SHMSIZE"
8a80: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8a90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8aa0: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20  OERR_SHMLOCK:   
8ab0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8ac0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
8ad0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8ae0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8af0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20  IOERR_SHMMAP:   
8b00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8b10: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
8b20: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8b30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8b40: 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20  _IOERR_SEEK:    
8b50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8b60: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22  LITE_IOERR_SEEK"
8b70: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
8b80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8b90: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
8ba0: 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  OENT: zName = "S
8bb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
8bc0: 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b  TE_NOENT";break;
8bd0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8be0: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20  TE_IOERR_MMAP:  
8bf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8c00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
8c10: 50 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  P";        break
8c20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8c30: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
8c40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8c50: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22  "SQLITE_CORRUPT"
8c60: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
8c70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8c80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
8c90: 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  B:       zName =
8ca0: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
8cb0: 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65  _VTAB";      bre
8cc0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8cd0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
8ce0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8cf0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  = "SQLITE_NOTFOU
8d00: 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  ND";          br
8d10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8d20: 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20  SQLITE_FULL:    
8d30: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8d40: 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22   = "SQLITE_FULL"
8d50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
8d60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8d70: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
8d80: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
8d90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
8da0: 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20  OPEN";          
8db0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8dc0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
8dd0: 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61  N_NOTEMPDIR: zNa
8de0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
8df0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22  TOPEN_NOTEMPDIR"
8e00: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
8e10: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
8e20: 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e  EN_ISDIR:     zN
8e30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
8e40: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20  NTOPEN_ISDIR";  
8e50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8e60: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
8e70: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a  PEN_FULLPATH:  z
8e80: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
8e90: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
8ea0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
8eb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54  case SQLITE_PROT
8ec0: 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20  OCOL:           
8ed0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8ee0: 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20  PROTOCOL";      
8ef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8f00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50   case SQLITE_EMP
8f10: 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TY:             
8f20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8f30: 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20  _EMPTY";        
8f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8f50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43    case SQLITE_SC
8f60: 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20  HEMA:           
8f70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8f80: 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20  E_SCHEMA";      
8f90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8fa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
8fb0: 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20  OOBIG:          
8fc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8fd0: 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20  TE_TOOBIG";     
8fe0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8ff0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9000: 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20  CONSTRAINT:     
9010: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9020: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b  ITE_CONSTRAINT";
9030: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9040: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9050: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
9060: 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  UE:  zName = "SQ
9070: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9080: 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a  UNIQUE"; break;.
9090: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
90a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
90b0: 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  GGER: zName = "S
90c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
90d0: 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b  _TRIGGER";break;
90e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
90f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
9100: 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20  REIGNKEY:.      
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9130: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9140: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22  AINT_FOREIGNKEY"
9150: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9160: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9170: 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20  STRAINT_CHECK:  
9180: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9190: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43  _CONSTRAINT_CHEC
91a0: 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  K";  break;.    
91b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
91c0: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
91d0: 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20  KEY:.           
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9200: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9210: 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62  PRIMARYKEY";   b
9220: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9230: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9240: 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d  NT_NOTNULL: zNam
9250: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
9260: 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b  TRAINT_NOTNULL";
9270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9280: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9290: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a  INT_COMMITHOOK:.
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
92d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
92e0: 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b  THOOK";   break;
92f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9300: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54  TE_CONSTRAINT_VT
9310: 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  AB:    zName = "
9320: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9330: 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b  T_VTAB";   break
9340: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9350: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
9360: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20  UNCTION:.       
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9390: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
93a0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20  INT_FUNCTION";  
93b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
93c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
93d0: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
93e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
93f0: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
9400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9410: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
9420: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
9430: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9440: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
9450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9460: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9470: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
9480: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9490: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
94a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
94b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
94c0: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
94d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
94e0: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
94f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9500: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9510: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
9520: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9530: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
9540: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9550: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9560: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
9570: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9580: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
9590: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
95a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
95b0: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
95c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
95d0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
95e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
95f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9600: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
9610: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9620: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
9630: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9640: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9650: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
9660: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9670: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
9680: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9690: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
96a0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
96b0: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
96c0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
96d0: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
96e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
96f0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
9700: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9730: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9740: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
9750: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
9760: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9770: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
9780: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9790: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
97a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
97b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
97c0: 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20  TE_DONE:        
97d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
97e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20  SQLITE_DONE";   
97f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9800: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
9810: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
9820: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42    static char zB
9830: 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[50];.    sqli
9840: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
9850: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
9860: 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e   "SQLITE_UNKNOWN
9870: 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a  (%d)", origRc);.
9880: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66      zName = zBuf
9890: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
98a0: 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Name;.}.#endif..
98b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
98c0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
98d0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
98e0: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
98f0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
9900: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
9910: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
9920: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
9930: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
9940: 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73   char* const aMs
9950: 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53  g[] = {.    /* S
9960: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
9970: 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72    */ "not an err
9980: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
9990: 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a  TE_ERROR       *
99a0: 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  / "SQL logic err
99b0: 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61  or or missing da
99c0: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
99d0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20  SQLITE_INTERNAL 
99e0: 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20     */ 0,.    /* 
99f0: 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20  SQLITE_PERM     
9a00: 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65     */ "access pe
9a10: 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22  rmission denied"
9a20: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
9a30: 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22  ABORT       */ "
9a40: 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74  callback request
9a50: 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c  ed query abort",
9a60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42  .    /* SQLITE_B
9a70: 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64  USY        */ "d
9a80: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
9a90: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
9aa0: 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f  E_LOCKED      */
9ab0: 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   "database table
9ac0: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
9ad0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   /* SQLITE_NOMEM
9ae0: 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f         */ "out o
9af0: 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f  f memory",.    /
9b00: 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  * SQLITE_READONL
9b10: 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74  Y    */ "attempt
9b20: 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64   to write a read
9b30: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a  only database",.
9b40: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
9b50: 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e  TERRUPT   */ "in
9b60: 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20  terrupted",.    
9b70: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  /* SQLITE_IOERR 
9b80: 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49        */ "disk I
9b90: 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  /O error",.    /
9ba0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
9bb0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
9bc0: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
9bd0: 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20  malformed",.    
9be0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  /* SQLITE_NOTFOU
9bf0: 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77  ND    */ "unknow
9c00: 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20  n operation",.  
9c10: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c    /* SQLITE_FULL
9c20: 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61          */ "data
9c30: 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20  base or disk is 
9c40: 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  full",.    /* SQ
9c50: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20  LITE_CANTOPEN   
9c60: 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f   */ "unable to o
9c70: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
9c80: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
9c90: 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f  E_PROTOCOL    */
9ca0: 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63   "locking protoc
9cb0: 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ol",.    /* SQLI
9cc0: 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a  TE_EMPTY       *
9cd0: 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  / "table contain
9ce0: 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20  s no data",.    
9cf0: 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  /* SQLITE_SCHEMA
9d00: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
9d10: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
9d20: 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  anged",.    /* S
9d30: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20  QLITE_TOOBIG    
9d40: 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20    */ "string or 
9d50: 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20  blob too big",. 
9d60: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     /* SQLITE_CON
9d70: 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e  STRAINT  */ "con
9d80: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c  straint failed",
9d90: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
9da0: 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64  ISMATCH    */ "d
9db0: 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
9dc0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
9dd0: 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20  _MISUSE      */ 
9de0: 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65  "library routine
9df0: 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73   called out of s
9e00: 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a  equence",.    /*
9e10: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
9e20: 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69      */ "large fi
9e30: 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69  le support is di
9e40: 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  sabled",.    /* 
9e50: 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20  SQLITE_AUTH     
9e60: 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61     */ "authoriza
9e70: 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  tion denied",.  
9e80: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d    /* SQLITE_FORM
9e90: 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69  AT      */ "auxi
9ea0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
9eb0: 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20  ormat error",.  
9ec0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47    /* SQLITE_RANG
9ed0: 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64  E       */ "bind
9ee0: 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78   or column index
9ef0: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a   out of range",.
9f00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
9f10: 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69  TADB      */ "fi
9f20: 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20  le is encrypted 
9f30: 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61  or is not a data
9f40: 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f  base",.  };.  co
9f50: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
9f60: 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "unknown error"
9f70: 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29  ;.  switch( rc )
9f80: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
9f90: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
9fa0: 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d  : {.      zErr =
9fb0: 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52   "abort due to R
9fc0: 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20  OLLBACK";.      
9fd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9fe0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
9ff0: 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20    rc &= 0xff;.  
a000: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 72      if( ALWAYS(r
a010: 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61  c>=0) && rc<Arra
a020: 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61  ySize(aMsg) && a
a030: 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20  Msg[rc]!=0 ){.  
a040: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73        zErr = aMs
a050: 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  g[rc];.      }. 
a060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a070: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
a080: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Err;.}../*.** Th
a090: 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
a0a0: 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c  ments a busy cal
a0b0: 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70  lback that sleep
a0c0: 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61  s and tries.** a
a0d0: 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d  gain until a tim
a0e0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65  eout value is re
a0f0: 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65  ached.  The time
a100: 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  out value is.** 
a110: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
a120: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
a130: 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74  s passed in as t
a140: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
a150: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
a160: 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c  int sqliteDefaul
a170: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20  tBusyCallback(. 
a180: 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20  void *ptr,      
a190: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
a1a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
a1b0: 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20  */. int count   
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a1d0: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
a1e0: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62  table has been b
a1f0: 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51  usy */.){.#if SQ
a200: 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28  LITE_OS_WIN || (
a210: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
a220: 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
a230: 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f  EEP).  static co
a240: 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20  nst u8 delays[] 
a250: 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35  =.     { 1, 2, 5
a260: 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35  , 10, 15, 20, 25
a270: 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20  , 25,  25,  50, 
a280: 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74   50, 100 };.  st
a290: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f  atic const u8 to
a2a0: 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  tals[] =.     { 
a2b0: 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c  0, 1, 3,  8, 18,
a2c0: 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33   33, 53, 78, 103
a2d0: 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20  , 128, 178, 228 
a2e0: 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c  };.# define NDEL
a2f0: 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c  AY ArraySize(del
a300: 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  ays).  sqlite3 *
a310: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
a320: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
a330: 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d  ut = db->busyTim
a340: 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61  eout;.  int dela
a350: 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73  y, prior;..  ass
a360: 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b  ert( count>=0 );
a370: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e  .  if( count < N
a380: 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c  DELAY ){.    del
a390: 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e  ay = delays[coun
a3a0: 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  t];.    prior = 
a3b0: 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20  totals[count];. 
a3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
a3d0: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
a3e0: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
a3f0: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
a400: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
a410: 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20  t-(NDELAY-1));. 
a420: 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b   }.  if( prior +
a430: 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74   delay > timeout
a440: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
a450: 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b  timeout - prior;
a460: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
a470: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
a480: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
a490: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
a4a0: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
a4b0: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71  rn 1;.#else.  sq
a4c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
a4d0: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
a4e0: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71  t timeout = ((sq
a4f0: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
a500: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  syTimeout;.  if(
a510: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
a520: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
a530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a540: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
a550: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
a560: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
a570: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
a580: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
a590: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
a5a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a5b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
a5c0: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
a5d0: 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b  iled with a lock
a5e0: 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  ..** If this rou
a5f0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
a600: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
a610: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
a620: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
a630: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
a640: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
a650: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
a660: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
a670: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
a680: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29  (BusyHandler *p)
a690: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
a6a0: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c  ( NEVER(p==0) ||
a6b0: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20   p->xFunc==0 || 
a6c0: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74  p->nBusy<0 ) ret
a6d0: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d  urn 0;.  rc = p-
a6e0: 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20  >xFunc(p->pArg, 
a6f0: 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28  p->nBusy);.  if(
a700: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d   rc==0 ){.    p-
a710: 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d  >nBusy = -1;.  }
a720: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  else{.    p->nBu
a730: 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sy++;.  }.  retu
a740: 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn rc; .}../*.**
a750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
a760: 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ts the busy call
a770: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
a780: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
a790: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
a7a0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
a7b0: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
a7c0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
a7d0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
a7e0: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
a7f0: 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  b,.  int (*xBusy
a800: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20  )(void*,int),.  
a810: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
a820: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a830: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
a840: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
a850: 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b  r.xFunc = xBusy;
a860: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
a870: 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  er.pArg = pArg;.
a880: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
a890: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64  r.nBusy = 0;.  d
a8a0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
a8b0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
a8c0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
a8d0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
a8e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
a8f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a900: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
a910: 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
a920: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
a930: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
a940: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
a950: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
a960: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
a970: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
a980: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
a990: 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20  t. The progress 
a9a0: 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a  callback will.**
a9b0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72   be invoked ever
a9c0: 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a  y nOps opcodes..
a9d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
a9e0: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
a9f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
aa00: 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20   .  int nOps,.  
aa10: 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29  int (*xProgress)
aa20: 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64  (void*), .  void
aa30: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69   *pArg.){.  sqli
aa40: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
aa50: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
aa60: 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20  ( nOps>0 ){.    
aa70: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
aa80: 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64  xProgress;.    d
aa90: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
aaa0: 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e  = nOps;.    db->
aab0: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
aac0: 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Arg;.  }else{.  
aad0: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
aae0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  = 0;.    db->nPr
aaf0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20  ogressOps = 0;. 
ab00: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
ab10: 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  Arg = 0;.  }.  s
ab20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ab30: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
ab40: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
ab50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73  This routine ins
ab60: 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20  talls a default 
ab70: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61  busy handler tha
ab80: 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a  t waits for the.
ab90: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
aba0: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
abb0: 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nds before retur
abc0: 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ning 0..*/.int s
abd0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
abe0: 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  out(sqlite3 *db,
abf0: 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20   int ms){.  if( 
ac00: 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ms>0 ){.    sqli
ac10: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
ac20: 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75  (db, sqliteDefau
ac30: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20  ltBusyCallback, 
ac40: 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20  (void*)db);.    
ac50: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
ac60: 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = ms;.  }else{. 
ac70: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
ac80: 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30  handler(db, 0, 0
ac90: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
aca0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
acb0: 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65  .** Cause any pe
acc0: 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  nding operation 
acd0: 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65  to stop at its e
ace0: 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e  arliest opportun
acf0: 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
ad00: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73  ite3_interrupt(s
ad10: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
ad20: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
ad30: 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ted = 1;.}.../*.
ad40: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ad50: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
ad60: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
ad70: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
ad80: 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  ), except.** tha
ad90: 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64  t it is designed
ada0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79   to be called by
adb0: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20   internal code. 
adc0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
add0: 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d  s.** that if a m
ade0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e  alloc() fails in
adf0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
ae00: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65  function(), an e
ae10: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
ae20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
ae30: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
ae40: 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a  ag cleared. .*/.
ae50: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74  int sqlite3Creat
ae60: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
ae70: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
ae80: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
ae90: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
aea0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
aeb0: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76   *pUserData,.  v
aec0: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
aed0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
aee0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
aef0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
af00: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
af10: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
af20: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
af30: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
af40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
af50: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
af60: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29  r *pDestructor.)
af70: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a  {.  FuncDef *p;.
af80: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20    int nName;..  
af90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
afa0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
afb0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a  utex) );.  if( z
afc0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
afd0: 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20  ||.      (xFunc 
afe0: 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53  && (xFinal || xS
aff0: 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  tep)) || .      
b000: 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e  (!xFunc && (xFin
b010: 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c  al && !xStep)) |
b020: 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20  |.      (!xFunc 
b030: 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78  && (!xFinal && x
b040: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
b050: 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67  (nArg<-1 || nArg
b060: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  >SQLITE_MAX_FUNC
b070: 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20  TION_ARG) ||.   
b080: 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d     (255<(nName =
b090: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b0a0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  ( zFunctionName)
b0b0: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
b0c0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
b0d0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e  KPT;.  }.  .#ifn
b0e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b0f0: 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51  UTF16.  /* If SQ
b100: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
b110: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
b120: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
b130: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
b140: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
b150: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
b160: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
b170: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
b180: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
b190: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
b1a0: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
b1b0: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a  nternally..  **.
b1c0: 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41    ** If SQLITE_A
b1d0: 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  NY is specified,
b1e0: 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69   add three versi
b1f0: 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ons of the funct
b200: 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ion.  ** to the 
b210: 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  hash table..  */
b220: 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  .  if( enc==SQLI
b230: 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20  TE_UTF16 ){.    
b240: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
b250: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73  16NATIVE;.  }els
b260: 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54  e if( enc==SQLIT
b270: 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74  E_ANY ){.    int
b280: 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
b290: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
b2a0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
b2b0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
b2c0: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70  UTF8,.         p
b2d0: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
b2e0: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
b2f0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
b300: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b310: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
b320: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
b330: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
b340: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
b350: 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20  ITE_UTF16LE,.   
b360: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
b370: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
b380: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
b390: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tor);.    }.    
b3a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b3b0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
b3c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
b3d0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
b3e0: 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  16BE;.  }.#else.
b3f0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
b400: 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20  TF8;.#endif.  . 
b410: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20   /* Check if an 
b420: 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f  existing functio
b430: 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  n is being overr
b440: 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64  idden or deleted
b450: 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e  . If so,.  ** an
b460: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
b470: 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74  ve VMs, then ret
b480: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
b490: 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20   If a function. 
b4a0: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65   ** is being ove
b4b0: 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20  rridden/deleted 
b4c0: 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  but there are no
b4d0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c   active VMs, all
b4e0: 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  ow the.  ** oper
b4f0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75  ation to continu
b500: 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65  e but invalidate
b510: 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64   all precompiled
b520: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
b530: 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  /.  p = sqlite3F
b540: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
b550: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
b560: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
b570: 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  enc, 0);.  if( p
b580: 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d   && p->iPrefEnc=
b590: 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d  =enc && p->nArg=
b5a0: 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28  =nArg ){.    if(
b5b0: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
b5c0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
b5d0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
b5e0: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
b5f0: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
b600: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72  lete/modify user
b610: 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f  -function due to
b620: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
b630: 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ts");.      asse
b640: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
b650: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
b660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
b670: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
b680: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
b690: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
b6a0: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  nts(db);.    }. 
b6b0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
b6c0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
b6d0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
b6e0: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75   nName, nArg, (u
b6f0: 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73  8)enc, 1);.  ass
b700: 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ert(p || db->mal
b710: 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66  locFailed);.  if
b720: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
b730: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b740: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
b750: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f   older version o
b760: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  f the function w
b770: 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64  ith a configured
b780: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20   destructor is. 
b790: 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63   ** being replac
b7a0: 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  ed invoke the de
b7b0: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
b7c0: 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e  n here. */.  fun
b7d0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
b7e0: 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73   p);..  if( pDes
b7f0: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70  tructor ){.    p
b800: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
b810: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65  ++;.  }.  p->pDe
b820: 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74  structor = pDest
b830: 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61  ructor;.  p->fla
b840: 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75  gs = 0;.  p->xFu
b850: 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d  nc = xFunc;.  p-
b860: 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a  >xStep = xStep;.
b870: 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d    p->xFinalize =
b880: 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55   xFinal;.  p->pU
b890: 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44  serData = pUserD
b8a0: 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d  ata;.  p->nArg =
b8b0: 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65   (u16)nArg;.  re
b8c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
b8e0: 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f  new user functio
b8f0: 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
b900: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
b910: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
b920: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
b930: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
b940: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
b950: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
b960: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
b970: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
b980: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
b990: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
b9a0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
b9b0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
b9c0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
b9d0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
b9e0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
b9f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
ba00: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
ba10: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
ba20: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75  Arg, enc, p, xFu
ba30: 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20  nc, xStep,.     
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78                 x
ba60: 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e  Final, 0);.}..in
ba70: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
ba80: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20  _function_v2(.  
ba90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
baa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
bab0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
bac0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
bad0: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
bae0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
baf0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
bb00: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
bb10: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
bb20: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
bb30: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
bb40: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
bb50: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
bb60: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
bb70: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20  *xDestroy)(void 
bb80: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
bb90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
bba0: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
bbb0: 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c  *pArg = 0;.  sql
bbc0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
bbd0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
bbe0: 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  f( xDestroy ){. 
bbf0: 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44     pArg = (FuncD
bc00: 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69  estructor *)sqli
bc10: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
bc20: 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44  db, sizeof(FuncD
bc30: 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20  estructor));.   
bc40: 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20   if( !pArg ){.  
bc50: 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b      xDestroy(p);
bc60: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b  .      goto out;
bc70: 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d  .    }.    pArg-
bc80: 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73  >xDestroy = xDes
bc90: 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e  troy;.    pArg->
bca0: 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20  pUserData = p;. 
bcb0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
bcc0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
bcd0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
bce0: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
bcf0: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29  p, xFinal, pArg)
bd00: 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ;.  if( pArg && 
bd10: 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  pArg->nRef==0 ){
bd20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
bd30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
bd40: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
bd50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bd60: 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  (db, pArg);.  }.
bd70: 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71  . out:.  rc = sq
bd80: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
bd90: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
bda0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
bdb0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
bdc0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
bdd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
bde0: 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  6.int sqlite3_cr
bdf0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
be00: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
be10: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
be20: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
be30: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
be40: 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20  TextRep,.  void 
be50: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
be60: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
be70: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
be80: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
be90: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
bea0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
beb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
bec0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
bed0: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
bee0: 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  xt*).){.  int rc
bef0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38  ;.  char *zFunc8
bf00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
bf10: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
bf20: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
bf30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bf40: 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71  );.  zFunc8 = sq
bf50: 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
bf60: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
bf70: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
bf80: 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d  6NATIVE);.  rc =
bf90: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
bfa0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e  nc(db, zFunc8, n
bfb0: 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70  Arg, eTextRep, p
bfc0: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
bfd0: 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c  xFinal,0);.  sql
bfe0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
bff0: 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73  Func8);.  rc = s
c000: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
c010: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
c020: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c030: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c040: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
c050: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
c060: 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68  hat a function h
c070: 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64  as been overload
c080: 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20  ed by a virtual 
c090: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
c0a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72  the function alr
c0b0: 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61  eady exists as a
c0c0: 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20   regular global 
c0d0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a  function, then.*
c0e0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
c0f0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74  s a no-op.  If t
c100: 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
c110: 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
c120: 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77   create.** a new
c130: 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73   one that always
c140: 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69   throws a run-ti
c150: 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a  me error.  .**.*
c160: 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74  * When virtual t
c170: 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20  ables intend to 
c180: 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c  provide an overl
c190: 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20  oaded function, 
c1a0: 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63  they.** should c
c1b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
c1c0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
c1d0: 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  e global functio
c1e0: 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67  n exists..** A g
c1f0: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d  lobal function m
c200: 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64  ust exist in ord
c210: 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f  er for name reso
c220: 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a  lution to work.*
c230: 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69  * properly..*/.i
c240: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c  nt sqlite3_overl
c250: 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  oad_function(.  
c260: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
c270: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c280: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a  ,.  int nArg.){.
c290: 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71    int nName = sq
c2a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
c2b0: 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ame);.  int rc =
c2c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
c2d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c2e0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c2f0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46  if( sqlite3FindF
c300: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
c310: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
c320: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d  SQLITE_UTF8, 0)=
c330: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
c340: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
c350: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
c360: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
c390: 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74  ite3InvalidFunct
c3a0: 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ion, 0, 0, 0);. 
c3b0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
c3c0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
c3d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
c3e0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
c3f0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
c400: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c410: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
c420: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
c430: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
c440: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
c450: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
c460: 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
c470: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
c480: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
c490: 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
c4a0: 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
c4b0: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
c4c0: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
c4d0: 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
c4e0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
c4f0: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
c500: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
c510: 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
c520: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ment..*/.void *s
c530: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
c540: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28  ite3 *db, void (
c550: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
c560: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
c570: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
c580: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
c590: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
c5a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
c5b0: 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67   = db->pTraceArg
c5c0: 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
c5d0: 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
c5e0: 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
c5f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c600: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
c610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
c620: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ;.}./*.** Regist
c630: 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
c640: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
c650: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
c660: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
c670: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
c680: 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
c690: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
c6a0: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
c6b0: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
c6c0: 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
c6d0: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
c6e0: 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
c6f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c700: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
c710: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
c720: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
c730: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
c740: 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
c750: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
c760: 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
c770: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
c780: 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
c790: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
c7a0: 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
c7b0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
c7c0: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
c7d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
c7e0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
c7f0: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
c800: 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
c810: 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
c820: 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
c830: 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
c840: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c850: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
c860: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
c870: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c880: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
c890: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
c8a0: 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
c8b0: 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
c8c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
c8d0: 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  its..** If the i
c8e0: 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
c8f0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
c900: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
c910: 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
c920: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
c930: 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
c940: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
c950: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
c960: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
c970: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
c980: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
c990: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
c9a0: 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
c9b0: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
c9c0: 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
c9d0: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
c9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
c9f0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
ca00: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
ca10: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
ca20: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ca30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
ca40: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
ca50: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
ca60: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
ca70: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
ca80: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
ca90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
caa0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
cab0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
cac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
cad0: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
cae0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
caf0: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
cb00: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
cb10: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
cb20: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
cb30: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
cb40: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
cb50: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  _update_hook(.  
cb60: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
cb70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
cb80: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
cb90: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
cba0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
cbb0: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
cbc0: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72  har const *,char
cbd0: 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f   const *,sqlite_
cbe0: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
cbf0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
cc00: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
cc10: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
cc20: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
cc30: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
cc40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
cc50: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
cc60: 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20  b->pUpdateArg;. 
cc70: 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
cc80: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
cc90: 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41  ;.  db->pUpdateA
cca0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
ccb0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ccc0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ccd0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
cce0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
ccf0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
cd00: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
cd10: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
cd20: 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  s rolled.** back
cd30: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
cd40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
cd50: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72  .void *sqlite3_r
cd60: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20  ollback_hook(.  
cd70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
cd80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
cd90: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
cda0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
cdb0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
cdc0: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20  ack)(void*), /* 
cdd0: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
cde0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  n */.  void *pAr
cdf0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
ce00: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
ce10: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
ce20: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
ce30: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ce40: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
ce50: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
ce60: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20  pRollbackArg;.  
ce70: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
ce80: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
ce90: 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  k;.  db->pRollba
cea0: 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ckArg = pArg;.  
ceb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
cec0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
ced0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
cee0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
cef0: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
cf00: 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69  _HOOK./*.** Regi
cf10: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
cf20: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
cf30: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
cf40: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
cf50: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
cf60: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
cf70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
cf80: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
cf90: 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  3_preupdate_hook
cfa0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cfc0: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
cfd0: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
cfe0: 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61  e */.  void(*xCa
cff0: 6c 6c 62 61 63 6b 29 28 20 20 20 20 20 20 20 20  llback)(        
d000: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
d010: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69  ction */.    voi
d020: 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c  d*,sqlite3*,int,
d030: 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72  char const*,char
d040: 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f   const*,sqlite3_
d050: 69 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e  int64,sqlite3_in
d060: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
d070: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d080: 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62    /* First callb
d090: 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ack argument */.
d0a0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
d0b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d0c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
d0d0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
d0e0: 70 50 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20  pPreUpdateArg;. 
d0f0: 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
d100: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
d110: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  ack;.  db->pPreU
d120: 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b  pdateArg = pArg;
d130: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d140: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
d150: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
d160: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d170: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
d180: 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
d190: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d1a0: 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65  IT_WAL./*.** The
d1b0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
d1c0: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  k() callback reg
d1d0: 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74  istered by sqlit
d1e0: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
d1f0: 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f  point()..** Invo
d200: 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ke sqlite3_wal_c
d210: 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
d220: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
d230: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
d240: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
d250: 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61  than sqlite3.pWa
d260: 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20  lArg cast to an 
d270: 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c  integer (the val
d280: 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ue configured by
d290: 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  .** wal_autochec
d2a0: 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69  kpoint())..*/ .i
d2b0: 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  nt sqlite3WalDef
d2c0: 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64  aultHook(.  void
d2d0: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20   *pClientData,  
d2e0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a     /* Argument *
d2f0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
d300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
d310: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
d320: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
d330: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
d340: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65   */.  int nFrame
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d360: 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29  Size of WAL */.)
d370: 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d  {.  if( nFrame>=
d380: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
d390: 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29  T(pClientData) )
d3a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
d3b0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
d3c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  ;.    sqlite3_wa
d3d0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
d3e0: 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   zDb);.    sqlit
d3f0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
d400: 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c();.  }.  retur
d410: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
d420: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d430: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
d440: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20  ** Configure an 
d450: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
d460: 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  () callback to a
d470: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
d480: 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74  ckpoint.** a dat
d490: 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d  abase after comm
d4a0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
d4b0: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
d4c0: 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d  e nFrame or.** m
d4d0: 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68  ore frames in th
d4e0: 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73  e log file. Pass
d4f0: 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65  ing zero or a ne
d500: 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20  gative value as 
d510: 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61  the.** nFrame pa
d520: 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73  rameter disables
d530: 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
d540: 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e  points entirely.
d550: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  .**.** The callb
d560: 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
d570: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
d580: 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69  replaces any exi
d590: 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a  sting callback.*
d5a0: 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  * registered usi
d5b0: 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
d5c0: 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c  ook(). Likewise,
d5d0: 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63   registering a c
d5e0: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  allback.** using
d5f0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
d600: 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65  k() disables the
d610: 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
d620: 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a  point mechanism.
d630: 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
d640: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
d650: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
d660: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
d670: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
d680: 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64  nt nFrame){.#ifd
d690: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
d6a0: 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  AL.  UNUSED_PARA
d6b0: 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
d6c0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
d6d0: 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69  rame);.#else.  i
d6e0: 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20  f( nFrame>0 ){. 
d6f0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
d700: 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57  ook(db, sqlite3W
d710: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53  alDefaultHook, S
d720: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
d730: 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c  (nFrame));.  }el
d740: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
d750: 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20  wal_hook(db, 0, 
d760: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
d770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
d790: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
d7a0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
d7b0: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
d7c0: 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e  ction is written
d7d0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69  .** into the wri
d7e0: 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20  te-ahead-log by 
d7f0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
d800: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
d810: 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  d *sqlite3_wal_h
d820: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
d830: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
d840: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
d850: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
d860: 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  s db handle */. 
d870: 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29   int(*xCallback)
d880: 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33  (void *, sqlite3
d890: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
d8a0: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
d8b0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d8c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d8d0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
d8e0: 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20   to xCallback() 
d8f0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
d900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
d910: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
d920: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d930: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d940: 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41  pRet = db->pWalA
d950: 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61  rg;.  db->xWalCa
d960: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d970: 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72  ck;.  db->pWalAr
d980: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
d990: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d9a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
d9b0: 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65  turn pRet;.#else
d9c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
d9d0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  dif.}../*.** Che
d9e0: 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
d9f0: 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   zDb..*/.int sql
da00: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
da10: 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  int_v2(.  sqlite
da20: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
da30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
da40: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
da50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
da60: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
da70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74    /* Name of att
da80: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28  ached database (
da90: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
daa0: 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20  t eMode,        
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dac0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
dad0: 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NT_* value */.  
dae0: 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20  int *pnLog,     
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
db10: 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65  WAL log in frame
db20: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b  s */.  int *pnCk
db30: 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pt              
db40: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
db50: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66  otal number of f
db60: 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74  rames checkpoint
db70: 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  ed */.){.#ifdef 
db80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
db90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dba0: 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  OK;.#else.  int 
dbb0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
dbd0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
dbe0: 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45  int iDb = SQLITE
dbf0: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20  _MAX_ATTACHED;  
dc00: 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  /* sqlite3.aDb[]
dc10: 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20   index of db to 
dc20: 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20  checkpoint */.. 
dc30: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
dc40: 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
dc50: 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73  les to -1 in cas
dc60: 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
dc70: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f  s. */.  if( pnLo
dc80: 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b  g ) *pnLog = -1;
dc90: 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20  .  if( pnCkpt ) 
dca0: 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20  *pnCkpt = -1;.. 
dcb0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
dcc0: 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e  CHECKPOINT_FULL>
dcd0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
dce0: 54 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61  T_PASSIVE );.  a
dcf0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
dd00: 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51  ECKPOINT_FULL<SQ
dd10: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
dd20: 52 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73  RESTART );.  ass
dd30: 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
dd40: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32  KPOINT_PASSIVE+2
dd50: 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ==SQLITE_CHECKPO
dd60: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20  INT_RESTART );. 
dd70: 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54   if( eMode<SQLIT
dd80: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
dd90: 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51  SIVE || eMode>SQ
dda0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
ddb0: 52 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72  RESTART ){.    r
ddc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
ddd0: 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  USE;.  }..  sqli
dde0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ddf0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
de00: 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20  ( zDb && zDb[0] 
de10: 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  ){.    iDb = sql
de20: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
de30: 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69  b, zDb);.  }.  i
de40: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
de50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
de60: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  R;.    sqlite3Er
de70: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45  ror(db, SQLITE_E
de80: 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  RROR, "unknown d
de90: 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44  atabase: %s", zD
dea0: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
deb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65   rc = sqlite3Che
dec0: 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c  ckpoint(db, iDb,
ded0: 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
dee0: 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69  nCkpt);.    sqli
def0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
df00: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   0);.  }.  rc = 
df10: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
df20: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
df30: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
df40: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
df50: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
df60: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
df70: 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
df80: 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c   If zDb is NULL,
df90: 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65   or if the buffe
dfa0: 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20  r zDb points.** 
dfb0: 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65  to contains a ze
dfc0: 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  ro-length string
dfd0: 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  , all attached d
dfe0: 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a  atabases are .**
dff0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
e000: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
e010: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  l_checkpoint(sql
e020: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
e030: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65  char *zDb){.  re
e040: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  turn sqlite3_wal
e050: 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
e060: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43  b, zDb, SQLITE_C
e070: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
e080: 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  E, 0, 0);.}..#if
e090: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e0a0: 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  _WAL./*.** Run a
e0b0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64   checkpoint on d
e0c0: 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69  atabase iDb. Thi
e0d0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
e0e0: 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a  database iDb is.
e0f0: 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ** not currently
e100: 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
e110: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  e..**.** If a tr
e120: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
e130: 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
e140: 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
e150: 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66  nted, this .** f
e160: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
e170: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e  SQLITE_LOCKED an
e180: 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  d a checkpoint i
e190: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e  s not attempted.
e1a0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
e1b0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75   occurs while ru
e1c0: 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70  nning the checkp
e1d0: 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20  oint, an SQLite 
e1e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
e1f0: 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e  * returned (i.e.
e200: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20   SQLITE_IOERR). 
e210: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
e220: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
e230: 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
e240: 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75  e handle db shou
e250: 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68  ld be held by th
e260: 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75  e caller. The mu
e270: 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  tex.** associate
e280: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
e290: 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67  fic b-tree being
e2a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73   checkpointed is
e2b0: 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69   taken by.** thi
e2c0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  s function while
e2d0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
e2e0: 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a  is running..**.*
e2f0: 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73  * If iDb is pass
e300: 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ed SQLITE_MAX_AT
e310: 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c  TACHED, then all
e320: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
e330: 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b  ses are.** check
e340: 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65  pointed. If an e
e350: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
e360: 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e  red it is return
e370: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d  ed immediately -
e380: 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69  .** no attempt i
e390: 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70  s made to checkp
e3a0: 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69  oint any remaini
e3b0: 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ng databases..**
e3c0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d  .** Parameter eM
e3d0: 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51  ode is one of SQ
e3e0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
e3f0: 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72  PASSIVE, FULL or
e400: 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74   RESTART..*/.int
e410: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69   sqlite3Checkpoi
e420: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
e430: 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f  int iDb, int eMo
e440: 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  de, int *pnLog, 
e450: 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20  int *pnCkpt){.  
e460: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e470: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e480: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e490: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
e4c0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
e4d0: 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20  ttached dbs */. 
e4e0: 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20   int bBusy = 0; 
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49   /* True if SQLI
e510: 54 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e  TE_BUSY has been
e520: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
e530: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e540: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
e550: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
e560: 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20  sert( !pnLog || 
e570: 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20  *pnLog==-1 );.  
e580: 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20  assert( !pnCkpt 
e590: 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29  || *pnCkpt==-1 )
e5a0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
e5b0: 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53  db->nDb && rc==S
e5c0: 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
e5d0: 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c      if( i==iDb |
e5e0: 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41  | iDb==SQLITE_MA
e5f0: 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20  X_ATTACHED ){.  
e600: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e610: 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28  BtreeCheckpoint(
e620: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20  db->aDb[i].pBt, 
e630: 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
e640: 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c  Ckpt);.      pnL
e650: 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e  og = 0;.      pn
e660: 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Ckpt = 0;.      
e670: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
e680: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62  USY ){.        b
e690: 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Busy = 1;.      
e6a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
e6b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e6c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
e6d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e6e0: 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f  bBusy) ? SQLITE_
e6f0: 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e  BUSY : rc;.}.#en
e700: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e710: 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
e720: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
e730: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d  eturns true if m
e740: 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c  ain-memory shoul
e750: 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  d be used instea
e760: 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  d of.** a tempor
e770: 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61  ary file for tra
e780: 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c  nsient pager fil
e790: 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  es and statement
e7a0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
e7b0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
e7c0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
e7d0: 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d  value of db->tem
e7e0: 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65  p_store (runtime
e7f0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61  .** parameter) a
e800: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74  nd the compile t
e810: 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c  ime value of SQL
e820: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20  ITE_TEMP_STORE. 
e830: 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
e840: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
e850: 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
e860: 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20  p between these 
e870: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e  two values.** an
e880: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73  d this functions
e890: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a   return value..*
e8a0: 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45  *.**   SQLITE_TE
e8b0: 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d  MP_STORE     db-
e8c0: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20  >temp_store     
e8d0: 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70  Location of temp
e8e0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  orary database.*
e8f0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
e900: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
e910: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
e920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
e940: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
e950: 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
e960: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
e970: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
e980: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
e990: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
e9b0: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
e9c0: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
ea00: 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 1).**   1     
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
ea30: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
ea40: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea60: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
ea70: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
ea80: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
ea90: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
eaa0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
eab0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
eac0: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
ead0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
eae0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
eb00: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
eb10: 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20  .**   3         
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
eb40: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
eb50: 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1).*/.int sqlit
eb60: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63  e3TempInMemory(c
eb70: 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62  onst sqlite3 *db
eb80: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  ){.#if SQLITE_TE
eb90: 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65  MP_STORE==1.  re
eba0: 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
ebb0: 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64  store==2 );.#end
ebc0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
ebd0: 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65  MP_STORE==2.  re
ebe0: 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
ebf0: 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64  store!=1 );.#end
ec00: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
ec10: 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65  MP_STORE==3.  re
ec20: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23  turn 1;.#endif.#
ec30: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
ec40: 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45  TORE<1 || SQLITE
ec50: 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20  _TEMP_STORE>3.  
ec60: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
ec70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ec80: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45   UTF-8 encoded E
ec90: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
eca0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
ecb0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
ecc0: 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
ecd0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
ece0: 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a  errmsg(sqlite3 *
ecf0: 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
ed00: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  r *z;.  if( !db 
ed10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
ed20: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
ed30: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20  TE_NOMEM);.  }. 
ed40: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
ed50: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
ed60: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
ed70: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
ed80: 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  (SQLITE_MISUSE_B
ed90: 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  KPT);.  }.  sqli
eda0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
edb0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
edc0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
edd0: 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71  ed ){.    z = sq
ede0: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
edf0: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c  TE_NOMEM);.  }el
ee00: 73 65 7b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61  se{.    z = (cha
ee10: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
ee20: 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b  _text(db->pErr);
ee30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
ee40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ee50: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
ee60: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
ee70: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
ee80: 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rCode);.    }.  
ee90: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
eea0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
eeb0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
eec0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
eed0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
eee0: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
eef0: 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
ef00: 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
ef10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
ef20: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
ef30: 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
ef40: 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
ef50: 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
ef60: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
ef70: 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d  u16 outOfMem[] =
ef80: 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c   {.    'o', 'u',
ef90: 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   't', ' ', 'o', 
efa0: 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27  'f', ' ', 'm', '
efb0: 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72  e', 'm', 'o', 'r
efc0: 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20  ', 'y', 0.  };. 
efd0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
efe0: 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20  6 misuse[] = {. 
eff0: 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27     'l', 'i', 'b'
f000: 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c  , 'r', 'a', 'r',
f010: 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'y', ' ', .    
f020: 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27  'r', 'o', 'u', '
f030: 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65  t', 'i', 'n', 'e
f040: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27  ', ' ', .    'c'
f050: 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c  , 'a', 'l', 'l',
f060: 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20   'e', 'd', ' ', 
f070: 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
f080: 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  t', ' ', .    'o
f090: 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'f', ' ', .  
f0a0: 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c    's', 'e', 'q',
f0b0: 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20   'u', 'e', 'n', 
f0c0: 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b  'c', 'e', 0.  };
f0d0: 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ..  const void *
f0e0: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
f0f0: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
f100: 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
f110: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f120: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
f130: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
f140: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73  turn (void *)mis
f150: 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  use;.  }.  sqlit
f160: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f170: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
f180: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f190: 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f  d ){.    z = (vo
f1a0: 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
f1b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
f1c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f1d0: 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
f1e0: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
f1f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
f200: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
f210: 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45 72  r, -1, sqlite3Er
f220: 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
f230: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  ),.           SQ
f240: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
f250: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
f260: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
f270: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
f280: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rr);.    }.    /
f290: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79  * A malloc() may
f2a0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74   have failed wit
f2b0: 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hin the call to 
f2c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f2d0: 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62  xt16().    ** ab
f2e0: 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
f2f0: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
f300: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
f310: 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
f320: 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61  o.    ** be clea
f330: 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  red before retur
f340: 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69  ning. Do this di
f350: 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
f360: 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71  of via.    ** sq
f370: 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20  lite3ApiExit(), 
f380: 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67  to avoid setting
f390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
f3a0: 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ndle error messa
f3b0: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ge..    */.    d
f3c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f3d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
f3e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f3f0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f400: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
f410: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
f420: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
f430: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
f440: 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
f450: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
f460: 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e   SQLite routine.
f470: 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70   If NULL is.** p
f480: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
f490: 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d  nction, we assum
f4a0: 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
f4b0: 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74  led during sqlit
f4c0: 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  e3_open()..*/.in
f4d0: 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  t sqlite3_errcod
f4e0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
f4f0: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
f500: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
f510: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
f520: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f530: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f540: 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
f550: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f560: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
f580: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
f590: 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61  Code & db->errMa
f5a0: 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  sk;.}.int sqlite
f5b0: 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
f5c0: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
f5d0: 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
f5e0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f5f0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
f600: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f610: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f620: 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
f630: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f640: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f650: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f660: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
f670: 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rCode;.}../*.** 
f680: 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
f690: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
f6a0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
f6b0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
f6c0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20  e.** argument.  
f6d0: 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69  For now, this si
f6e0: 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69  mply calls the i
f6f0: 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45  nternal sqlite3E
f700: 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74  rrStr().** funct
f710: 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
f720: 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73  ar *sqlite3_errs
f730: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65  tr(int rc){.  re
f740: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
f750: 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tr(rc);.}../*.**
f760: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f   Create a new co
f770: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
f780: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64   for database "d
f790: 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73  b".  The name is
f7a0: 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68   zName.** and th
f7b0: 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e  e encoding is en
f7c0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
f7d0: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
f7e0: 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
f7f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f800: 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c  Name, .  u8 enc,
f810: 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
f820: 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
f830: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
f840: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
f850: 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
f860: 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
f870: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
f880: 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20  ;.  int enc2;.  
f890: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  int nName = sqli
f8a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
f8b0: 65 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  e);.  .  assert(
f8c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f8d0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
f8e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  ;..  /* If SQLIT
f8f0: 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
f900: 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
f910: 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
f920: 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
f930: 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
f940: 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
f950: 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
f960: 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
f970: 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
f980: 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
f990: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
f9a0: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65  rnally..  */.  e
f9b0: 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73  nc2 = enc;.  tes
f9c0: 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
f9d0: 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74  ITE_UTF16 );.  t
f9e0: 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
f9f0: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
fa00: 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63  NED );.  if( enc
fa10: 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
fa20: 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  || enc2==SQLITE_
fa30: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b  UTF16_ALIGNED ){
fa40: 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49  .    enc2 = SQLI
fa50: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
fa60: 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53    }.  if( enc2<S
fa70: 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e  QLITE_UTF8 || en
fa80: 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c2>SQLITE_UTF16B
fa90: 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
faa0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
fab0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
fac0: 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c  eck if this call
fad0: 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20   is removing or 
fae0: 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69  replacing an exi
faf0: 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  sting collation 
fb00: 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20  .  ** sequence. 
fb10: 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65  If so, and there
fb20: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
fb30: 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66   return busy. If
fb40: 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20   there.  ** are 
fb50: 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69  no active VMs, i
fb60: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72  nvalidate any pr
fb70: 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
fb80: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43  ments..  */.  pC
fb90: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
fba0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
fbb0: 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29  )enc2, zName, 0)
fbc0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26  ;.  if( pColl &&
fbd0: 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a   pColl->xCmp ){.
fbe0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69      if( db->acti
fbf0: 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20  veVdbeCnt ){.   
fc00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
fc10: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
fc20: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
fc30: 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
fc40: 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  fy collation seq
fc50: 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74  uence due to act
fc60: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
fc70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
fc80: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
fc90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
fca0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
fcb0: 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20  ments(db);..    
fcc0: 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* If collation 
fcd0: 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77  sequence pColl w
fce0: 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63  as created direc
fcf0: 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  tly by a call to
fd00: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
fd10: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
fd20: 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61  , and not genera
fd30: 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ted by synthColl
fd40: 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68  Seq(),.    ** th
fd50: 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61  en any copies ma
fd60: 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  de by synthCollS
fd70: 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20  eq() need to be 
fd80: 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20  invalidated..   
fd90: 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74   ** Also, collat
fda0: 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d  ion destructor -
fdb0: 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20   CollSeq.xDel() 
fdc0: 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e  - function may n
fdd0: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
fde0: 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20   called..    */ 
fdf0: 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d  .    if( (pColl-
fe00: 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55  >enc & ~SQLITE_U
fe10: 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65  TF16_ALIGNED)==e
fe20: 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  nc2 ){.      Col
fe30: 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71  lSeq *aColl = sq
fe40: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
fe50: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
fe60: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
fe70: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
fe80: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
fe90: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
fea0: 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a  eq *p = &aColl[j
feb0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
fec0: 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
fed0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  c ){.          i
fee0: 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20  f( p->xDel ){.  
fef0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65            p->xDe
ff00: 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20  l(p->pUser);.   
ff10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ff20: 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a     p->xCmp = 0;.
ff30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ff40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
ff50: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
ff60: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
ff70: 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31  8)enc2, zName, 1
ff80: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  );.  if( pColl==
ff90: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
ffa0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c  E_NOMEM;.  pColl
ffb0: 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72  ->xCmp = xCompar
ffc0: 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65  e;.  pColl->pUse
ffd0: 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c  r = pCtx;.  pCol
ffe0: 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a  l->xDel = xDel;.
fff0: 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28    pColl->enc = (
10000 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20  u8)(enc2 | (enc 
10010 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  & SQLITE_UTF16_A
10020 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69  LIGNED));.  sqli
10030 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
10040 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65  ITE_OK, 0);.  re
10050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10060 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  }.../*.** This a
10070 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72  rray defines har
10080 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f  d upper bounds o
10090 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20  n limit values. 
100a0 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   The.** initiali
100b0 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74  zer must be kept
100c0 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68   in sync with th
100d0 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a  e SQLITE_LIMIT_*
100e0 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20  .** #defines in 
100f0 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74  sqlite3.h..*/.st
10100 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61  atic const int a
10110 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a  HardLimit[] = {.
10120 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e    SQLITE_MAX_LEN
10130 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
10140 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20  X_SQL_LENGTH,.  
10150 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
10160 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  N,.  SQLITE_MAX_
10170 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  EXPR_DEPTH,.  SQ
10180 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
10190 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49  D_SELECT,.  SQLI
101a0 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a  TE_MAX_VDBE_OP,.
101b0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e    SQLITE_MAX_FUN
101c0 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c  CTION_ARG,.  SQL
101d0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
101e0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ,.  SQLITE_MAX_L
101f0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
10200 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
10210 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
10220 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ,.  SQLITE_MAX_T
10230 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b  RIGGER_DEPTH,.};
10240 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
10250 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
10260 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
10270 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
10280 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
10290 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
102a0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
102b0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
102c0 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
102d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
102e0 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
102f0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10300 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
10310 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
10320 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
10330 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
10340 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
10350 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
10360 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
10370 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
10380 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
10390 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
103a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
103b0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
103c0 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
103d0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
103e0 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
103f0 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
10400 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10410 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
10420 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10430 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
10440 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
10450 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10460 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
10470 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
10480 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30  FUNCTION_ARG>100
10490 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
104a0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
104b0 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  G must be betwee
104c0 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e  n 0 and 1000.#en
104d0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
104e0 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c  AX_ATTACHED<0 ||
104f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
10500 43 48 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20  CHED>62.# error 
10510 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
10520 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77  HED must be betw
10530 65 65 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e  een 0 and 62.#en
10540 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10550 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
10560 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
10570 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
10580 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
10590 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
105a0 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
105b0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
105c0 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
105d0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
105e0 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
105f0 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
10600 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
10610 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
10620 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
10630 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
10640 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
10650 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
10660 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
10670 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70  of a limit.  Rep
10680 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
10690 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61  e..** If an inva
106a0 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20  lid limit index 
106b0 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70  is supplied, rep
106c0 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20  ort -1..** Make 
106d0 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73  no changes but s
106e0 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  till report the 
106f0 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65  old value if the
10700 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73  .** new limit is
10710 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
10720 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d   A new lower lim
10730 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69  it does not shri
10740 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73  nk existing cons
10750 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65  tructs..** It me
10760 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65  rely prevents ne
10770 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61  w constructs tha
10780 74 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d  t exceed the lim
10790 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69  it.** from formi
107a0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
107b0 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33  e3_limit(sqlite3
107c0 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49   *db, int limitI
107d0 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29  d, int newLimit)
107e0 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74  {.  int oldLimit
107f0 3b 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;...  /* EVIDENC
10800 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34  E-OF: R-30189-54
10810 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d  097 For each lim
10820 69 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49  it category SQLI
10830 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20  TE_LIMIT_NAME.  
10840 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61  ** there is a ha
10850 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73  rd upper bound s
10860 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  et at compile-ti
10870 6d 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f  me by a C prepro
10880 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72  cessor.  ** macr
10890 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f  o called SQLITE_
108a0 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22  MAX_NAME. (The "
108b0 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20  _LIMIT_" in the 
108c0 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20  name is changed 
108d0 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e  to.  ** "_MAX_".
108e0 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
108f0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10900 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
10910 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  ==SQLITE_MAX_LEN
10920 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
10930 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10940 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
10950 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  GTH]==SQLITE_MAX
10960 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _SQL_LENGTH );. 
10970 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
10980 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10990 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45  _COLUMN]==SQLITE
109a0 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _MAX_COLUMN );. 
109b0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
109c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
109d0 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51  _EXPR_DEPTH]==SQ
109e0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
109f0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
10a00 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10a10 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
10a20 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54  D_SELECT]==SQLIT
10a30 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
10a40 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74  ELECT);.  assert
10a50 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
10a60 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
10a70 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  P]==SQLITE_MAX_V
10a80 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65  DBE_OP );.  asse
10a90 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
10aa0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
10ab0 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54  TION_ARG]==SQLIT
10ac0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
10ad0 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RG );.  assert( 
10ae0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
10af0 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
10b00 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ]==SQLITE_MAX_AT
10b10 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65  TACHED );.  asse
10b20 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
10b30 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
10b40 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
10b50 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ==.             
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
10b90 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
10ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
10bb0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
10bc0 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
10bd0 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d  UMBER]==SQLITE_M
10be0 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
10bf0 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ER);.  assert( a
10c00 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
10c10 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
10c20 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EPTH]==SQLITE_MA
10c30 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
10c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
10c50 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
10c60 52 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45  R_DEPTH==(SQLITE
10c70 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a  _N_LIMIT-1) );..
10c80 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30  .  if( limitId<0
10c90 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c   || limitId>=SQL
10ca0 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20  ITE_N_LIMIT ){. 
10cb0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
10cc0 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64  }.  oldLimit = d
10cd0 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
10ce0 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d  d];.  if( newLim
10cf0 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20  it>=0 ){        
10d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d             /* IM
10d10 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32  P: R-52476-28732
10d20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c   */.    if( newL
10d30 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b  imit>aHardLimit[
10d40 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20  limitId] ){.    
10d50 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61    newLimit = aHa
10d60 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
10d70 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34  ;  /* IMP: R-514
10d80 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20  63-25634 */.    
10d90 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74  }.    db->aLimit
10da0 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c  [limitId] = newL
10db0 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
10dc0 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20  rn oldLimit;    
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31   /* IMP: R-53341
10df0 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  -35419 */.}../*.
10e00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10e10 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73   is used to pars
10e20 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20  e both URIs and 
10e30 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
10e40 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a  s passed by the.
10e50 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66  ** user to API f
10e60 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33  unctions sqlite3
10e70 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
10e80 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e  e3_open_v2(), an
10e90 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a  d for database.*
10ea0 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64  * URIs specified
10eb0 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41   as part of ATTA
10ec0 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CH statements..*
10ed0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
10ee0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
10ef0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
10f00 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
10f10 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20  to use (or.** a 
10f20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20  NULL to signify 
10f30 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29  the default VFS)
10f40 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73   if the URI does
10f50 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22   not contain a "
10f60 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72  vfs=xxx".** quer
10f70 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65  y parameter. The
10f80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10f90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52   contains the UR
10fa0 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69  I (or non-URI fi
10fb0 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c  lename).** itsel
10fc0 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  f. When this fun
10fd0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
10fe0 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69  the *pFlags vari
10ff0 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74  able should cont
11000 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  ain.** the defau
11010 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  lt flags to open
11020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
11030 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76  ndle with. The v
11040 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
11050 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65  * *pFlags may be
11060 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20   updated before 
11070 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65  returning if the
11080 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f   URI filename co
11090 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68  ntains .** "cach
110a0 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d  e=xxx" or "mode=
110b0 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d  xxx" query param
110c0 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eters..**.** If 
110d0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
110e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
110f0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
11100 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f  *ppVfs is set to
11110 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
11120 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64   VFS that should
11130 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e   be used to open
11140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11150 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73  le. *pzFile is s
11160 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
11170 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
11180 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  ining the name o
11190 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70  f the file to op
111a0 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  en. It is the .*
111b0 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
111c0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
111d0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c  o eventually cal
111e0 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
111f0 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74   to release.** t
11200 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  his buffer..**.*
11210 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
11220 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51  curs, then an SQ
11230 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
11240 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
11250 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79  *pzErrMsg.** may
11260 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
11270 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
11280 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69  taining an Engli
11290 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
112a0 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49  r .** message. I
112b0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
112c0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
112d0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
112e0 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  lly release.** t
112f0 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61  his buffer by ca
11300 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
11310 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ee()..*/.int sql
11320 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20  ite3ParseUri(.  
11330 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66  const char *zDef
11340 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20  aultVfs,        
11350 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66  /* VFS to use if
11360 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75   no "vfs=xxx" qu
11370 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ery option */.  
11380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
11390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
113a0 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
113b0 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a  d URI to parse *
113c0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
113d0 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20   *pFlags,       
113e0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
113f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
11400 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
11410 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20  3_vfs **ppVfs,  
11420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
11430 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20  : VFS to use */ 
11440 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65  .  char **pzFile
11450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11460 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e     /* OUT: Filen
11470 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ame component of
11480 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a   URI */.  char *
11490 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
114a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
114b0 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
114c0 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (if rc!=SQLITE_O
114d0 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  K) */.){.  int r
114e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
114f0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
11500 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20  ags = *pFlags;. 
11510 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
11520 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b  s = zDefaultVfs;
11530 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
11540 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20    char c;.  int 
11550 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nUri = sqlite3St
11560 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20  rlen30(zUri);.. 
11570 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d   assert( *pzErrM
11580 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  sg==0 );..  if( 
11590 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
115a0 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71  _OPEN_URI) || sq
115b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
115c0 67 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20  g.bOpenUri) .   
115d0 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65  && nUri>=5 && me
115e0 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65  mcmp(zUri, "file
115f0 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a  :", 5)==0 .  ){.
11600 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a      char *zOpt;.
11610 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20      int eState; 
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74    /* Parser stat
11640 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55  e when parsing U
11650 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  RI */.    int iI
11660 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11670 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
11680 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
11690 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74   */.    int iOut
116a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
116b0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
116c0 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
116d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
116e0 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20   = nUri+2;      
116f0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
11700 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
11710 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  te */..    /* Ma
11720 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49  ke sure the SQLI
11730 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67  TE_OPEN_URI flag
11740 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63   is set to indic
11750 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78  ate to the VFS x
11760 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74  Open .    ** met
11770 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d  hod that there m
11780 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61  ay be extra para
11790 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67  meters following
117a0 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20   the file-name. 
117b0 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   */.    flags |=
117c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
117d0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30  ;..    for(iIn=0
117e0 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b  ; iIn<nUri; iIn+
117f0 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72  +) nByte += (zUr
11800 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20  i[iIn]=='&');.  
11810 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
11820 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
11830 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
11840 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11850 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44  NOMEM;..    /* D
11860 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d  iscard the schem
11870 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20  e and authority 
11880 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  segments of the 
11890 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  URI. */.    if( 
118a0 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20  zUri[5]=='/' && 
118b0 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a  zUri[6]=='/' ){.
118c0 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20        iIn = 7;. 
118d0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69       while( zUri
118e0 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49  [iIn] && zUri[iI
118f0 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b  n]!='/' ) iIn++;
11900 0a 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21  ..      if( iIn!
11910 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c  =7 && (iIn!=16 |
11920 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68  | memcmp("localh
11930 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20  ost", &zUri[7], 
11940 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  9)) ){.        *
11950 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
11960 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61  e3_mprintf("inva
11970 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74  lid uri authorit
11980 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20  y: %.*s", .     
11990 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a         iIn-7, &z
119a0 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20  Uri[7]);.       
119b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
119c0 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
119d0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
119e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
119f0 65 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 35  e{.      iIn = 5
11a00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11a10 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d  Copy the filenam
11a20 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20  e and any query 
11a30 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20  parameters into 
11a40 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72  the zFile buffer
11a50 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65  . .    ** Decode
11a60 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65   %HH escape code
11a70 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  s along the way.
11a80 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
11a90 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  Within this loop
11aa0 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74  , variable eStat
11ab0 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
11ac0 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e  0, 1 or 2, depen
11ad0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ding.    ** on t
11ae0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
11af0 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  xt. As follows:.
11b00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
11b10 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d  0: Parsing file-
11b20 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31  name..    **   1
11b30 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73  : Parsing name s
11b40 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
11b50 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
11b60 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  ameter..    **  
11b70 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75   2: Parsing valu
11b80 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
11b90 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
11ba0 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
11bb0 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30  /.    eState = 0
11bc0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
11bd0 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
11be0 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20  && c!='#' ){.   
11bf0 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
11c00 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20  if( c=='%' .    
11c10 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
11c20 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29  digit(zUri[iIn])
11c30 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
11c40 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
11c50 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20  [iIn+1]) .      
11c60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
11c70 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48  ctet = (sqlite3H
11c80 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
11c90 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20  ++]) << 4);.    
11ca0 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c      octet += sql
11cb0 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
11cc0 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20  i[iIn++]);..    
11cd0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65      assert( octe
11ce0 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35  t>=0 && octet<25
11cf0 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
11d00 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20   octet==0 ){.   
11d10 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
11d20 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
11d30 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72  hen "%00" appear
11d40 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49  s within the URI
11d50 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20  . In this.      
11d60 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69      ** case we i
11d70 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69  gnore all text i
11d80 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
11d90 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d  of the path, nam
11da0 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  e or.          *
11db0 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  * value currentl
11dc0 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20  y being parsed. 
11dd0 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75  So ignore the cu
11de0 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a  rrent character.
11df0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
11e00 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78   skip to the nex
11e10 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26  t "?", "=" or "&
11e20 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ", as appropriat
11e30 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
11e40 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
11e50 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
11e60 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '#' .           
11e70 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30     && (eState!=0
11e80 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20   || c!='?').    
11e90 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
11ea0 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27  tate!=1 || (c!='
11eb0 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20  =' && c!='&')). 
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
11ed0 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21  (eState!=2 || c!
11ee0 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='&').          
11ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
11f00 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
11f10 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
11f20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
11f30 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65          c = octe
11f40 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
11f50 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20  f( eState==1 && 
11f60 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d  (c=='&' || c=='=
11f70 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ') ){.        if
11f80 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d  ( zFile[iOut-1]=
11f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11fa0 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69  /* An empty opti
11fb0 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20  on name. Ignore 
11fc0 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f  this option alto
11fd0 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gether. */.     
11fe0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69       while( zUri
11ff0 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49  [iIn] && zUri[iI
12000 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b  n]!='#' && zUri[
12010 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49  iIn-1]!='&' ) iI
12020 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  n++;.          c
12030 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12040 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63   }.        if( c
12050 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20  =='&' ){.       
12060 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
12070 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
12080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12090 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20    eState = 2;.  
120a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
120b0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 0;.      }el
120c0 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d  se if( (eState==
120d0 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20  0 && c=='?') || 
120e0 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d  (eState==2 && c=
120f0 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='&') ){.       
12100 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
12110 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  eState = 1;.    
12120 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b    }.      zFile[
12130 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  iOut++] = c;.   
12140 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74   }.    if( eStat
12150 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75  e==1 ) zFile[iOu
12160 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
12170 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
12180 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
12190 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
121a0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
121b0 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79  f there were any
121c0 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69   options specifi
121d0 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ed that should b
121e0 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20  e interpreted . 
121f0 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69     ** here. Opti
12200 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74  ons that are int
12210 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e  erpreted here in
12220 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20  clude "vfs" and 
12230 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a  those that.    *
12240 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  * correspond to 
12250 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62  flags that may b
12260 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
12270 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
12280 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e  ).    ** method.
12290 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26   */.    zOpt = &
122a0 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72  zFile[sqlite3Str
122b0 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b  len30(zFile)+1];
122c0 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74  .    while( zOpt
122d0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  [0] ){.      int
122e0 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53   nOpt = sqlite3S
122f0 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20  trlen30(zOpt);. 
12300 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20       char *zVal 
12310 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b  = &zOpt[nOpt+1];
12320 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20  .      int nVal 
12330 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12340 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20  0(zVal);..      
12350 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d  if( nOpt==3 && m
12360 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70  emcmp("vfs", zOp
12370 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 3)==0 ){.    
12380 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b      zVfs = zVal;
12390 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
123a0 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65        struct Ope
123b0 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20  nMode {.        
123c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
123d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
123e0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a  ode;.        } *
123f0 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  aMode = 0;.     
12400 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79     char *zModeTy
12410 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pe = 0;.        
12420 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  int mask = 0;.  
12430 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20        int limit 
12440 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  = 0;..        if
12450 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d  ( nOpt==5 && mem
12460 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70  cmp("cache", zOp
12470 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 5)==0 ){.    
12480 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
12490 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61  uct OpenMode aCa
124a0 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  cheMode[] = {.  
124b0 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61            { "sha
124c0 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  red",  SQLITE_OP
124d0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d  EN_SHAREDCACHE }
124e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
124f0 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54  "private", SQLIT
12500 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
12510 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
12520 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
12530 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
12540 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
12550 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
12560 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  HE|SQLITE_OPEN_P
12570 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20  RIVATECACHE;.   
12580 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
12590 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20  CacheMode;.     
125a0 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73       limit = mas
125b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  k;.          zMo
125c0 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22  deType = "cache"
125d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
125e0 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20      if( nOpt==4 
125f0 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22  && memcmp("mode"
12600 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b  , zOpt, 4)==0 ){
12610 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
12620 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
12630 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20  e aOpenMode[] = 
12640 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
12650 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "ro",  SQLITE_OP
12660 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20  EN_READONLY },. 
12670 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
12680 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
12690 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20  READWRITE }, .  
126a0 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63            { "rwc
126b0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ", SQLITE_OPEN_R
126c0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
126d0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c  E_OPEN_CREATE },
126e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
126f0 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f  memory", SQLITE_
12700 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20  OPEN_MEMORY },. 
12710 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
12720 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
12730 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
12740 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
12750 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45  EADONLY | SQLITE
12760 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
12790 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
127a0 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20  _OPEN_MEMORY;.  
127b0 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
127c0 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20  aOpenMode;.     
127d0 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73       limit = mas
127e0 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  k & flags;.     
127f0 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
12800 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20   "access";.     
12810 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
12820 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( aMode ){.     
12830 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
12840 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d        int mode =
12850 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
12860 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e  r(i=0; aMode[i].
12870 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; i++){.       
12880 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
12890 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  *z = aMode[i].z;
128a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
128b0 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74   nVal==sqlite3St
128c0 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d  rlen30(z) && 0==
128d0 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20  memcmp(zVal, z, 
128e0 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  nVal) ){.       
128f0 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d         mode = aM
12900 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20  ode[i].mode;.   
12910 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
12920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
12930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12940 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d        if( mode==
12950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
12960 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
12970 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
12980 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25   such %s mode: %
12990 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a  s", zModeType, z
129a0 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
129b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
129c0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
129d0 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
129e0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
129f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
12a00 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f  mode & ~SQLITE_O
12a10 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69  PEN_MEMORY)>limi
12a20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
12a30 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
12a40 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
12a50 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65   mode not allowe
12a60 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  d: %s",.        
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29  zModeType, zVal)
12aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
12ab0 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a   = SQLITE_PERM;.
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
12ad0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
12ae0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12af0 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66        flags = (f
12b00 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20  lags & ~mask) | 
12b10 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mode;.        }.
12b20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a        }..      z
12b30 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c  Opt = &zVal[nVal
12b40 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  +1];.    }..  }e
12b50 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  lse{.    zFile =
12b60 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
12b70 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28  nUri+2);.    if(
12b80 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
12b90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12ba0 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
12bb0 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
12bc0 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
12bd0 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
12be0 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
12bf0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
12c00 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
12c10 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
12c20 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
12c30 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
12c40 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
12c50 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
12c60 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
12c70 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
12c80 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
12c90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
12ca0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
12cb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12cc0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
12cd0 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
12ce0 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
12cf0 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
12d00 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
12d10 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
12d20 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
12d30 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
12d40 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
12d50 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
12d60 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
12d70 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
12d80 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
12d90 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
12da0 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
12db0 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
12dc0 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
12dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
12de0 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
12df0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
12e00 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
12e10 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
12e20 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
12e30 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
12e40 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
12e50 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
12e60 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
12e70 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f   int flags,    /
12e80 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
12e90 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
12ea0 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
12eb0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
12ec0 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
12ed0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ef0 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63    /* Store alloc
12f00 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65  ated handle here
12f10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
12f40 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
12f50 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20  Threadsafe;     
12f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
12f70 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65  e for threadsafe
12f80 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
12f90 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20    char *zOpen = 
12fa0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12fb0 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72    /* Filename ar
12fc0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
12fd0 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f  o BtreeOpen() */
12fe0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
12ff0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13000 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
13010 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  age from sqlite3
13020 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20  ParseUri() */.. 
13030 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
13040 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13050 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
13060 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
13070 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
13080 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
13090 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c  if..  /* Only al
130a0 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d  low sensible com
130b0 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74  binations of bit
130c0 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61  s in the flags a
130d0 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20  rgument.  .  ** 
130e0 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
130f0 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20  f any non-sense 
13100 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75  combination is u
13110 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  sed.  If we.  **
13120 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c   do not block il
13130 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f  legal combinatio
13140 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c  ns here, it coul
13150 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61  d trigger.  ** a
13160 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
13170 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79  ts in deeper lay
13180 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63  ers.  Sensible c
13190 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a  ombinations.  **
131a0 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   are:.  **.  ** 
131b0 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   1:  SQLITE_OPEN
131c0 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20  _READONLY.  **  
131d0 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  2:  SQLITE_OPEN_
131e0 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20  READWRITE.  **  
131f0 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  6:  SQLITE_OPEN_
13200 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
13210 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20  TE_OPEN_CREATE. 
13220 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51   */.  assert( SQ
13230 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
13240 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20  LY  == 0x01 );. 
13250 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
13260 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d  OPEN_READWRITE =
13270 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65  = 0x02 );.  asse
13280 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
13290 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30  CREATE    == 0x0
132a0 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
132b0 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
132c0 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44  =0x02 ); /* READ
132d0 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61  ONLY */.  testca
132e0 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
132f0 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52  ))==0x04 ); /* R
13300 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65  EADWRITE */.  te
13310 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
13320 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20  gs&7))==0x40 ); 
13330 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20 43  /* READWRITE | C
13340 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28  REATE */.  if( (
13350 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26  (1<<(flags&7)) &
13360 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65 74 75   0x46)==0 ) retu
13370 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
13380 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73 71  _BKPT;..  if( sq
13390 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
133a0 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20  g.bCoreMutex==0 
133b0 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
133c0 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
133d0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
133e0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
133f0 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
13400 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
13410 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
13420 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
13430 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72  TEX ){.    isThr
13440 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d  eadsafe = 1;.  }
13450 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65  else{.    isThre
13460 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33  adsafe = sqlite3
13470 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
13480 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69  llMutex;.  }.  i
13490 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
134a0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
134b0 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  CHE ){.    flags
134c0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
134d0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
134e0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
134f0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68  3GlobalConfig.sh
13500 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
13510 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
13520 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
13530 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
13540 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66   /* Remove harmf
13550 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65  ul bits from the
13560 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
13570 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
13580 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
13590 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50  EX and SQLITE_OP
135a0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61  EN_FULLMUTEX fla
135b0 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61  gs were.  ** dea
135c0 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70  lt with in the p
135d0 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f  revious code blo
135e0 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65  ck.  Besides the
135f0 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a  se, the only.  *
13600 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c  * valid input fl
13610 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
13620 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51  open_v2() are SQ
13630 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
13640 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  LY,.  ** SQLITE_
13650 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20  OPEN_READWRITE, 
13660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
13670 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
13680 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a  SHAREDCACHE,.  *
13690 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  * SQLITE_OPEN_PR
136a0 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20  IVATECACHE, and 
136b0 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69  some reserved bi
136c0 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61  ts.  Silently ma
136d0 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20  sk.  ** off all 
136e0 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a  other flags..  *
136f0 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28  /.  flags &=  ~(
13700 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
13710 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
13720 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13730 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
13740 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
13750 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
13760 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20  AIN_DB |.       
13770 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13780 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20  PEN_TEMP_DB | . 
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
137a0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
137b0 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  ENT_DB | .      
137c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
137d0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
137e0 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
137f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
13800 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  TEMP_JOURNAL | .
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13820 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
13830 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
13840 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13850 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
13860 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  AL |.           
13870 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
13880 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  NOMUTEX |.      
13890 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
138a0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c  OPEN_FULLMUTEX |
138b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
138c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
138e0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
138f0 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73  he sqlite data s
13900 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62  tructure */.  db
13910 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
13920 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c  Zero( sizeof(sql
13930 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64  ite3) );.  if( d
13940 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e  b==0 ) goto open
13950 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73  db_out;.  if( is
13960 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20  Threadsafe ){.  
13970 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71    db->mutex = sq
13980 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13990 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
139a0 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28  URSIVE);.    if(
139b0 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b   db->mutex==0 ){
139c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
139d0 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64  ree(db);.      d
139e0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74  b = 0;.      got
139f0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
13a00 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
13a10 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
13a20 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
13a30 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a  errMask = 0xff;.
13a40 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20    db->nDb = 2;. 
13a50 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
13a60 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
13a70 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
13a80 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73  aDbStatic;..  as
13a90 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d  sert( sizeof(db-
13aa0 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66  >aLimit)==sizeof
13ab0 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a  (aHardLimit) );.
13ac0 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69    memcpy(db->aLi
13ad0 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c  mit, aHardLimit,
13ae0 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
13af0 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f  it));.  db->auto
13b00 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62  Commit = 1;.  db
13b10 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20  ->nextAutovac = 
13b20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70  -1;.  db->szMmap
13b30 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
13b40 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20  Config.szMmap;. 
13b50 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
13b60 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  e = 0;.  db->fla
13b70 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
13b80 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c  rtColNames | SQL
13b90 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20 7c 20  ITE_AutoIndex | 
13ba0 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
13bb0 67 67 65 72 0a 23 69 66 20 53 51 4c 49 54 45 5f  gger.#if SQLITE_
13bc0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
13bd0 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
13be0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
13bf0 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
13c00 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
13c10 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
13c20 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
13c30 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
13c40 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
13c50 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13c60 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
13c70 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13c90 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
13ca0 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
13cb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13cc0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
13cd0 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
13ce0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
13cf0 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
13d00 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
13d10 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
13d20 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65        ;.  sqlite
13d30 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
13d40 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
13d50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13d60 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
13d70 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
13d80 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
13d90 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
13da0 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
13db0 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
13dc0 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
13dd0 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
13de0 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
13df0 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
13e00 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
13e10 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
13e20 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
13e30 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
13e40 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
13e50 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
13e60 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
13e70 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
13e80 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
13e90 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
13ea0 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
13eb0 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
13ec0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
13ed0 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
13ee0 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
13ef0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
13f00 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
13f10 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
13f20 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e  _UTF16LE, 0, bin
13f30 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
13f40 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
13f50 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
13f60 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
13f70 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
13f80 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
13f90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13fa0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
13fb0 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44  ut;.  }.  db->pD
13fc0 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
13fd0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13fe0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42   SQLITE_UTF8, "B
13ff0 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73  INARY", 0);.  as
14000 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
14010 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
14020 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38  Also add a UTF-8
14030 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
14040 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
14050 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74  ence. */.  creat
14060 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
14070 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
14080 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
14090 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
140a0 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
140b0 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61  e filename/URI a
140c0 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62  rgument. */.  db
140d0 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
140e0 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ags;.  rc = sqli
140f0 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73  te3ParseUri(zVfs
14100 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
14110 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20  ags, &db->pVfs, 
14120 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67  &zOpen, &zErrMsg
14130 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
14150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
14160 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EM ) db->mallocF
14170 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73  ailed = 1;.    s
14180 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
14190 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
141a0 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
141b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
141c0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
141d0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
141e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
141f0 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
14200 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
14210 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14220 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
14230 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
14240 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
14250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14260 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
14270 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
14280 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
14290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
142a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
142b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
142c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
142d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
142e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
142f0 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  db, rc, 0);.    
14300 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14310 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30  .  }.  db->aDb[0
14320 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
14330 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
14340 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29   db->aDb[0].pBt)
14350 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ;.  db->aDb[1].p
14360 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
14370 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29  SchemaGet(db, 0)
14380 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  ;...  /* The def
14390 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
143a0 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
143b0 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c  atabase is 'full
143c0 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a  '; for the temp.
143d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74    ** database it
143e0 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73   is 'NONE'. This
143f0 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67   matches the pag
14400 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74  er layer default
14410 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  s.  .  */.  db->
14420 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[0].zName = "
14430 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62  main";.  db->aDb
14440 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [0].safety_level
14450 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b   = 3;.  db->aDb[
14460 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70  1].zName = "temp
14470 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
14480 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31  safety_level = 1
14490 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
144a0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
144b0 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
144c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
144d0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
144e0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
144f0 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
14500 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
14510 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
14520 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
14530 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
14540 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
14550 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
14560 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
14570 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
14580 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
14590 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
145a0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
145b0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  ;.  sqlite3Regis
145c0 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
145d0 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ons(db);..  /* L
145e0 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78  oad automatic ex
145f0 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e  tensions - exten
14600 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  sions that have 
14610 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a  been registered.
14620 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73    ** using the s
14630 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63  qlite3_automatic
14640 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49  _extension() API
14650 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
14660 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
14670 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
14680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
14690 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
146a0 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20  ensions(db);.   
146b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
146c0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69  rcode(db);.    i
146d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
146e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   ){.      goto o
146f0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
14700 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14710 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
14720 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
14730 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
14740 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
14750 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
14760 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
14770 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
14780 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
14790 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
147a0 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
147b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
147c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
147d0 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
147e0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
147f0 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
14800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
14810 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
14820 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
14830 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
14840 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
14850 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
14860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14870 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
14880 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
14890 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
148a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
148b0 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
148c0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
148d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
148e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
148f0 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
14900 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
14910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
14920 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
14930 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
14940 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
14950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
14960 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
14970 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
14980 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
14990 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  );..  /* -DSQLIT
149a0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
149b0 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
149c0 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
149d0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
149e0 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
149f0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
14a00 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
14a10 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
14a20 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
14a30 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
14a40 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
14a50 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
14a60 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
14a70 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
14a80 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
14a90 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
14aa0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
14ab0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
14ac0 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
14ad0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
14ae0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
14af0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14b20 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
14b30 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
14b40 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
14b50 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
14b60 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
14b70 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
14b80 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
14b90 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
14ba0 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
14bc0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
14bd0 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
14be0 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  .  sqlite3_wal_a
14bf0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
14c00 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
14c10 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
14c20 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75  INT);..opendb_ou
14c30 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
14c40 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20  e(zOpen);.  if( 
14c50 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  db ){.    assert
14c60 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c  ( db->mutex!=0 |
14c70 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  | isThreadsafe==
14c80 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  0 || sqlite3Glob
14c90 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
14ca0 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
14cb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14cc0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
14cd0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
14ce0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
14cf0 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c  assert( db!=0 ||
14d00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
14d10 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  M );.  if( rc==S
14d20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
14d30 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
14d40 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
14d50 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
14d60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14d70 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
14d80 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
14d90 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20  ;.  }.  *ppDb = 
14da0 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  db;.#ifdef SQLIT
14db0 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
14dc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
14dd0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
14de0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  g ){.    /* Open
14df0 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e  ing a db handle.
14e00 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
14e10 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a  r is passed 0. *
14e20 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67  /.    void *pArg
14e30 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
14e40 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
14e50 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  g;.    sqlite3Gl
14e60 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
14e70 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69  og(pArg, db, zFi
14e80 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  lename, 0);.  }.
14e90 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
14ea0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
14eb0 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
14ec0 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
14ed0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
14ee0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
14ef0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14f00 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
14f10 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
14f20 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
14f30 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
14f40 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14f60 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
14f70 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
14f80 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
14f90 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
14fa0 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
14fb0 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
14fc0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
14fd0 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
14fe0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
14ff0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
15000 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
15010 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15030 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
15040 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
15050 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
15060 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
15070 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
15080 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
15090 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e  ename, ppDb, (un
150a0 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73  signed int)flags
150b0 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
150c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
150d0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
150e0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
150f0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
15100 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
15110 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
15120 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
15130 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
15140 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
15150 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
15160 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
15170 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
15180 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
15190 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
151a0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
151b0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
151c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
151d0 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d  pDb );.  *ppDb =
151e0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
151f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
15200 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15210 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
15220 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
15230 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61  rc;.#endif.  pVa
15240 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
15250 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
15260 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
15270 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  l, -1, zFilename
15280 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
15290 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41  TIVE, SQLITE_STA
152a0 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  TIC);.  zFilenam
152b0 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  e8 = sqlite3Valu
152c0 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
152d0 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20  TE_UTF8);.  if( 
152e0 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20  zFilename8 ){.  
152f0 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62    rc = openDatab
15300 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20  ase(zFilename8, 
15310 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
15320 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15330 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
15340 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
15350 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20  CREATE, 0);.    
15360 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c  assert( *ppDb ||
15370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
15380 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  M );.    if( rc=
15390 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44  =SQLITE_OK && !D
153a0 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70  bHasProperty(*pp
153b0 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  Db, 0, DB_Schema
153c0 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20  Loaded) ){.     
153d0 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51   ENC(*ppDb) = SQ
153e0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
153f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
15400 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15410 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71  _NOMEM;.  }.  sq
15420 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
15430 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
15440 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
15450 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  , rc);.}.#endif 
15460 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
15470 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
15480 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
15490 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
154a0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
154b0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
154c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
154d0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
154e0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
154f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
15500 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
15510 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
15520 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
15530 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
15540 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
15550 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
15560 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
15570 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
15580 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
15590 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
155a0 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
155b0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
155c0 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20  zName, (u8)enc, 
155d0 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
155e0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
155f0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
15600 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
15610 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
15620 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
15630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
15640 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
15650 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
15660 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
15670 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
15680 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
15690 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
156a0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
156b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
156c0 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
156d0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
156e0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
156f0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
15700 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
15710 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
15720 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
15730 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
15740 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
15750 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
15760 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
15770 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
15780 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
15790 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
157a0 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
157b0 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63  are, xDel);.  rc
157c0 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
157d0 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
157e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
157f0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
15800 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
15810 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15820 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
15830 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
15840 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
15850 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
15860 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
15870 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
15880 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
15890 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
158a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
158b0 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  me,.  int enc, .
158c0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
158d0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
158e0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
158f0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
15900 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
15910 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15920 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20   char *zName8;. 
15930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15940 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
15950 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
15960 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
15970 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74    zName8 = sqlit
15980 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
15990 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
159a0 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
159b0 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
159c0 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
159d0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
159e0 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  e8, (u8)enc, pCt
159f0 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
15a00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
15a10 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
15a20 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
15a30 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
15a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
15a50 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
15a60 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
15a70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
15a80 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
15a90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
15aa0 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
15ab0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
15ac0 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
15ad0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
15ae0 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
15af0 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
15b00 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
15b10 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
15b20 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
15b30 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
15b40 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
15b50 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
15b60 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
15b70 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
15b80 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
15b90 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
15ba0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
15bb0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15bc0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
15bd0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
15be0 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
15bf0 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
15c00 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
15c10 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
15c20 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
15c30 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
15c40 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
15c50 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
15c60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
15c70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15c80 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
15c90 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
15ca0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
15cb0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
15cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
15cd0 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
15ce0 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
15cf0 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
15d00 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15d10 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
15d20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
15d30 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71  n_needed16(.  sq
15d40 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
15d50 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
15d60 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
15d70 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64  llNeeded16)(void
15d80 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
15d90 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f  TextRep,const vo
15da0 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  id*).){.  sqlite
15db0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
15dc0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
15dd0 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
15de0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
15df0 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
15e00 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
15e10 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
15e20 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
15e30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15e40 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
15e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15e60 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
15e70 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
15e80 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
15e90 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
15ea0 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  TED./*.** This f
15eb0 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61  unction is now a
15ec0 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49  n anachronism. I
15ed0 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65  t used to be use
15ee0 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  d to recover fro
15ef0 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  m a.** malloc() 
15f00 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c  failure, but SQL
15f10 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69  ite now does thi
15f20 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  s automatically.
15f30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
15f40 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76  global_recover(v
15f50 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  oid){.  return S
15f60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
15f70 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  if../*.** Test t
15f80 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
15f90 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
15fa0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
15fb0 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a  in autocommit.**
15fc0 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54   mode.  Return T
15fd0 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64  RUE if it is and
15fe0 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20   FALSE if not.  
15ff0 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  Autocommit mode 
16000 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61  is on.** by defa
16010 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  ult.  Autocommit
16020 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20   is disabled by 
16030 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
16040 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a  t and reenabled.
16050 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43  ** by the next C
16060 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
16070 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48  K..**.******* TH
16080 49 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d  IS IS AN EXPERIM
16090 45 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53  ENTAL API AND IS
160a0 20 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e   SUBJECT TO CHAN
160b0 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74  GE ******.*/.int
160c0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
160d0 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
160e0 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
160f0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d  b->autoCommit;.}
16100 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
16110 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
16120 72 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f  re subtitutes fo
16130 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
16140 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
16150 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
16160 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
16170 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
16180 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
16190 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
161a0 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20  s.  They server 
161b0 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a  two purposes:.**
161c0 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20  .**   1.  Serve 
161d0 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  as a convenient 
161e0 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
161f0 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64  reakpoint in a d
16200 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  ebugger.**      
16210 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
16220 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f  version error co
16230 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e  nditions occurs.
16240 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76  .**.**   2.  Inv
16250 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  oke sqlite3_log(
16260 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  ) to provide the
16270 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63   source code loc
16280 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20  ation where.**  
16290 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c       a low-level
162a0 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20   error is first 
162b0 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74  detected..*/.int
162c0 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45   sqlite3CorruptE
162d0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
162e0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
162f0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16300 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
16310 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
16320 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20  E_CORRUPT,.     
16330 20 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61           "databa
16340 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74  se corruption at
16350 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
16360 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
16370 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
16380 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
16390 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
163a0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69  ITE_CORRUPT;.}.i
163b0 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65  nt sqlite3Misuse
163c0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
163d0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
163e0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
163f0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
16400 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
16410 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20  TE_MISUSE, .    
16420 20 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73            "misus
16430 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
16440 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
16450 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
16460 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
16470 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
16480 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
16490 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
164a0 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
164b0 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
164c0 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
164d0 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
164e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  );.  sqlite3_log
164f0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
16500 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
16510 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
16520 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  le at line %d of
16530 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
16540 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
16550 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
16560 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
16570 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
16580 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N;.}...#ifndef S
16590 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
165a0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
165b0 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
165c0 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
165d0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
165e0 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
165f0 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
16600 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
16610 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
16620 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
16630 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
16640 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
16650 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
16660 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
16670 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
16680 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
16690 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
166a0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
166b0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
166c0 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
166d0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
166e0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
166f0 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
16700 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
16710 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
16720 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
16730 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
16740 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
16750 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ils..*/.#ifdef S
16760 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
16770 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74  UMN_METADATA.int
16780 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
16790 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
167a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
167c0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
167d0 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
167e0 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
167f0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16800 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
16810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
16820 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
16830 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
16840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
16850 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
16860 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
16870 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
16880 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
16890 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
168a0 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
168b0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
168c0 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
168d0 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
168e0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
168f0 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
16900 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16910 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
16920 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
16930 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
16940 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
16950 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
16960 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
16970 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
16980 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
16990 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
169a0 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
169b0 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
169c0 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
169d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
169e0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
169f0 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
16a00 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
16a10 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
16a20 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72  nt iCol;..  char
16a30 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
16a40 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
16a50 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
16a60 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
16a70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
16a80 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
16a90 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
16aa0 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
16ab0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
16ac0 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
16ad0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
16ae0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
16af0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
16b00 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
16b10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
16b20 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
16b30 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
16b40 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
16b50 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
16b60 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
16b70 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
16b80 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
16b90 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
16ba0 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
16bb0 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
16bc0 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
16bd0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
16be0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
16bf0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
16c00 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
16c10 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
16c20 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
16c30 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ted */.  if( sql
16c40 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
16c50 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
16c60 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
16c70 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ey;.    if( iCol
16c80 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  >=0 ){.      pCo
16c90 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
16ca0 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iCol];.    }.  }
16cb0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
16cc0 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
16cd0 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
16ce0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
16cf0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
16d00 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
16d10 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
16d20 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
16d30 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
16d40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16d50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
16d60 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
16d70 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30  {.      pTab = 0
16d80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72  ;.      goto err
16d90 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
16da0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
16db0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
16dc0 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
16dd0 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
16de0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
16df0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
16e00 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
16e10 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
16e20 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
16e30 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
16e40 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
16e50 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
16e60 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
16e70 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
16e80 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
16e90 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
16ea0 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
16eb0 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
16ec0 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
16ed0 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
16ee0 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
16ef0 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
16f00 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
16f10 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
16f20 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
16f30 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
16f40 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
16f50 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
16f60 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
16f70 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
16f80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
16f90 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
16fa0 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
16fb0 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f   zDataType = pCo
16fc0 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43  l->zType;.    zC
16fd0 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
16fe0 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
16ff0 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
17000 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
17010 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63  ykey  = (pCol->c
17020 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
17030 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20  G_PRIMKEY)!=0;. 
17040 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
17050 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
17060 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
17070 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
17080 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
17090 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
170a0 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
170b0 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
170c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
170d0 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
170e0 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
170f0 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
17100 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
17110 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
17120 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
17130 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
17140 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
17150 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
17160 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
17170 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
17180 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
17190 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
171a0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
171b0 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
171c0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
171d0 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
171e0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
171f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
17200 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
17210 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
17220 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
17230 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
17240 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
17250 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
17260 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
17270 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
17280 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
17290 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
172a0 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
172b0 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
172c0 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
172d0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
172e0 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
172f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
17300 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
17310 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
17320 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
17330 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
17340 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
17350 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
17360 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
17370 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
17380 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
17390 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  ror(db, rc, (zEr
173a0 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
173b0 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
173c0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
173d0 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
173e0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
173f0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
17400 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
17410 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
17420 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
17430 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
17440 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
17450 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
17460 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
17470 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
17480 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
17490 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
174a0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
174b0 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
174c0 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
174d0 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
174e0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
174f0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
17500 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
17510 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
17520 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
17530 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
17540 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
17550 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
17560 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
17570 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
17580 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
17590 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
175a0 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
175b0 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
175c0 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
175d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
175e0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
175f0 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
17600 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20  b, int onoff){. 
17610 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17620 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
17630 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
17640 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
17650 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
17660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
17670 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
17680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
176a0 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
176b0 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
176c0 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
176d0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
176e0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
176f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
17700 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
17710 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
17720 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
17730 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
17740 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
17750 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
17760 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
17770 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73  x);.  pBtree = s
17780 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
17790 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
177a0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
177b0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
177c0 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
177d0 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73  _file *fd;.    s
177e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
177f0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50  (pBtree);.    pP
17800 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
17810 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
17820 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
17830 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66  ager!=0 );.    f
17840 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
17850 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
17860 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
17870 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
17880 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
17890 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
178a0 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
178b0 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
178c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
178d0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
178e0 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
178f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
17900 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
17910 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
17920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17930 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17940 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
17950 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17960 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
17970 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
17980 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
17990 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
179a0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65    .}../*.** Inte
179b0 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
179c0 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
179d0 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
179e0 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
179f0 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
17a00 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
17a10 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
17a20 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
17a30 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
17a40 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
17a50 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
17a60 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
17a70 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
17a80 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
17a90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17aa0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
17ab0 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
17ac0 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
17ad0 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
17ae0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
17af0 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
17b00 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
17b10 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
17b20 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
17b30 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
17b40 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
17b50 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
17b60 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
17b70 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
17b80 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
17b90 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
17ba0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
17bb0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
17bc0 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
17bd0 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
17be0 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
17bf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17c00 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
17c10 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
17c20 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
17c30 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
17c40 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
17c50 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
17c60 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
17c70 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
17c80 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
17c90 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
17ca0 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
17cb0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
17cc0 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
17cd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
17ce0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
17cf0 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
17d00 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74  sqlite3PrngReset
17d10 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
17d20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17d30 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
17d40 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
17d50 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
17d60 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
17d70 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
17d80 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
17d90 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
17da0 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
17db0 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
17dc0 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
17dd0 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
17de0 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
17df0 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
17e00 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
17e10 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
17e20 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
17e30 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
17e40 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
17e50 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
17e60 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
17e70 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
17e80 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
17e90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17ea0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
17eb0 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
17ec0 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
17ed0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
17ee0 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
17ef0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
17f00 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
17f10 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
17f20 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
17f30 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
17f40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
17f50 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
17f60 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
17f70 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
17f80 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
17f90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
17fa0 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
17fb0 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
17fc0 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
17fd0 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
17fe0 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
17ff0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
18000 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
18010 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
18020 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
18030 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
18040 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
18050 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
18060 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
18070 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
18080 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
18090 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
180a0 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
180b0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
180c0 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
180d0 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
180e0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
180f0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
18100 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
18110 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
18120 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
18130 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
18140 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
18150 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
18160 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
18170 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
18180 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
18190 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
181a0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
181b0 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
181c0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
181d0 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
181e0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
181f0 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
18200 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
18210 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
18220 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
18230 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
18240 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
18250 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
18260 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
18270 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
18280 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
18290 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
182a0 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
182b0 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
182c0 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
182d0 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
182e0 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
182f0 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
18300 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18310 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
18320 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
18330 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72 69  .    ** dileteri
18340 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
18350 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
18360 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
18370 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
18380 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
18390 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
183a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
183b0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
183c0 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
183d0 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
183e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
183f0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
18400 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
18410 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
18420 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
18430 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18440 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
18450 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
18460 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
18470 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
18480 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
18490 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
184a0 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
184b0 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
184c0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
184d0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
184e0 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
184f0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
18500 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
18510 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
18520 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
18530 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
18540 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
18550 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
18560 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
18570 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
18580 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
18590 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
185a0 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
185b0 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
185c0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
185d0 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
185e0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
185f0 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
18600 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
18610 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
18620 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
18630 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
18640 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
18650 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
18660 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
18670 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
18680 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
18690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
186a0 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
186b0 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
186c0 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
186d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
186e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
186f0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
18700 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
18710 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
18720 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18730 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
18740 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
18750 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
18760 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
18770 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
18780 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
18790 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
187a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
187b0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
187c0 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20  s ALWAYS(X).  . 
187d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
187e0 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73   recommended tes
187f0 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74  t is X==2.  If t
18800 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
18810 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 2, that means
18820 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29  .    ** ALWAYS()
18830 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
18840 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73   both no-op pass
18850 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c  -through macros,
18860 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20   which is the.  
18870 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74    ** default set
18880 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65  ting.  If the re
18890 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c  turn value is 1,
188a0 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69   then ALWAYS() i
188b0 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  s either.    ** 
188c0 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
188d0 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73  ue or else it as
188e0 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67  serts if its arg
188f0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a  ument is false..
18900 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
18910 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d   behavior (hard-
18920 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69  coded to true) i
18930 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
18940 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
18950 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
18960 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
18970 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  is disabled and 
18980 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
18990 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65  * behavior (asse
189a0 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  rt if the argume
189b0 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69  nt to ALWAYS() i
189c0 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20  s false) is the 
189d0 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
189e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
189f0 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
18a00 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
18a10 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  bled..    **.   
18a20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65   ** The run-time
18a30 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20   test procedure 
18a40 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74  might look somet
18a50 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
18a60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
18a70 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
18a80 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
18a90 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
18aa0 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a  , 2)==2 ){.    *
18ab0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
18ac0 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
18ad0 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  re no-op pass-th
18ae0 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20  rough macros.   
18af0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   **    }else if(
18b00 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
18b10 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
18b20 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29  TCTRL_ASSERT, 1)
18b30 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   ){.    **      
18b40 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73  // ALWAYS(x) ass
18b50 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74  erts that x is t
18b60 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73  rue. NEVER(x) as
18b70 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65  serts x is false
18b80 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  ..    **    }els
18b90 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  e{.    **      /
18ba0 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61  / ALWAYS(x) is a
18bb0 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45   constant 1.  NE
18bc0 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73  VER(x) is a cons
18bd0 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20  tant 0..    **  
18be0 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63    }.    */.    c
18bf0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
18c00 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20  TRL_ALWAYS: {.  
18c10 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
18c20 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
18c30 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29    rc = ALWAYS(x)
18c40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18c50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
18c60 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
18c70 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
18c80 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c  TRL_RESERVE, sql
18c90 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
18ca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
18cb0 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  et the nReserve 
18cc0 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68  size to N for th
18cd0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
18ce0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
18cf0 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f      ** connectio
18d00 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  n db..    */.   
18d10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18d20 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b  TCTRL_RESERVE: {
18d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
18d40 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
18d50 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
18d60 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
18d70 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  ap,int);.      s
18d80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
18d90 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
18da0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
18db0 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d  eSetPageSize(db-
18dc0 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20  >aDb[0].pBt, 0, 
18dd0 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  x, 0);.      sql
18de0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
18df0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
18e00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18e10 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
18e20 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
18e30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
18e40 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c  TIMIZATIONS, sql
18e50 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
18e60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
18e70 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
18e80 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
18e90 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69  ations for testi
18ea0 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
18eb0 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  e .    ** argume
18ec0 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73  nt N is a bitmas
18ed0 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
18ee0 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ns to be disable
18ef0 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20  d.  For normal. 
18f00 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20     ** operation 
18f10 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20  N should be 0.  
18f20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
18f30 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20   a test program 
18f40 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a  (like the.    **
18f50 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20   SQL Logic Test 
18f60 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75  or SLT test modu
18f70 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20  le) can run the 
18f80 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c  same SQL multipl
18f90 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77  e times.    ** w
18fa0 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ith various opti
18fb0 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c  mizations disabl
18fc0 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
18fd0 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  t the same answe
18fe0 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61  r.    ** is obta
18ff0 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61  ined in every ca
19000 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
19010 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19020 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
19030 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
19040 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
19050 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
19060 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c       db->dbOptFl
19070 61 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61  ags = (u16)(va_a
19080 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78  rg(ap, int) & 0x
19090 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65  ffff);.      bre
190a0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
190b0 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
190c0 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  RD.    /* sqlite
190d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
190e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
190f0 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20  SKEYWORD, const 
19100 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20  char *zWord).   
19110 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57   **.    ** If zW
19120 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64  ord is a keyword
19130 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74   recognized by t
19140 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20  he parser, then 
19150 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a  return the.    *
19160 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77  * number of keyw
19170 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f  ords.  Or if zWo
19180 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77  rd is not a keyw
19190 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ord, return 0.. 
191a0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68     ** .    ** Th
191b0 69 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20  is test feature 
191c0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
191d0 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d  e in the amalgam
191e0 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20  ation since.    
191f0 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f  ** the SQLITE_N_
19200 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73  KEYWORD macro is
19210 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20   not defined in 
19220 74 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c  this file if SQL
19230 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75  ite.    ** is bu
19240 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61  ilt using separa
19250 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e  te source files.
19260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
19270 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19280 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20  _ISKEYWORD: {.  
19290 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
192a0 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61  zWord = va_arg(a
192b0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
192c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
192d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
192e0 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20  Word);.      rc 
192f0 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  = (sqlite3Keywor
19300 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64  dCode((u8*)zWord
19310 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53  , n)!=TK_ID) ? S
19320 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
19330 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  : 0;.      break
19340 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a  ;.    }.#endif .
19350 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
19360 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
19370 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
19380 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20  ATCHMALLOC, sz, 
19390 26 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20  &pNew, pFree);. 
193a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73     **.    ** Pas
193b0 73 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c  s pFree into sql
193c0 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
193d0 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a  ). .    ** If sz
193e0 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  >0 then allocate
193f0 20 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65   a scratch buffe
19400 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20  r into pNew.  . 
19410 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19420 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
19430 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a  CRATCHMALLOC: {.
19440 20 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65        void *pFre
19450 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20  e, **ppNew;.    
19460 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
19470 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
19480 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65  int);.      ppNe
19490 77 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  w = va_arg(ap, v
194a0 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46  oid**);.      pF
194b0 72 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ree = va_arg(ap,
194c0 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69   void*);.      i
194d0 66 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d  f( sz ) *ppNew =
194e0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
194f0 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20  alloc(sz);.     
19500 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
19510 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20  ree(pFree);.    
19520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
19530 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
19540 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
19550 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
19560 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69  CALTIME_FAULT, i
19570 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a  nt onoff);.    *
19580 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61  *.    ** If para
19590 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e  meter onoff is n
195a0 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75  on-zero, configu
195b0 72 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20  re the wrappers 
195c0 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20  so that all.    
195d0 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ** subsequent ca
195e0 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65  lls to localtime
195f0 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20  () and variants 
19600 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69  fail. If onoff i
19610 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75  s zero,.    ** u
19620 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67  ndo this setting
19630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
19640 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
19650 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
19660 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
19670 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
19680 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d  LocaltimeFault =
19690 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
196a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
196b0 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65     }..#if define
196c0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
196d0 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20  TREE_EXPLAIN).  
196e0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
196f0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
19700 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c  TE_TESTCTRL_EXPL
19710 41 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a 2a  AIN_STMT,.    **
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19740 73 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72  stmt*,const char
19750 2a 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  **);.    **.    
19760 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77  ** If compiled w
19770 69 74 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ith SQLITE_ENABL
19780 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c 20  E_TREE_EXPLAIN, 
19790 65 61 63 68 20 73 71 6c 69 74 65 33 5f 73 74 6d  each sqlite3_stm
197a0 74 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20 61  t holds.    ** a
197b0 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
197c0 63 72 69 62 65 73 20 74 68 65 20 6f 70 74 69 6d  cribes the optim
197d0 69 7a 65 64 20 70 61 72 73 65 20 74 72 65 65 2e  ized parse tree.
197e0 20 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74    This test-cont
197f0 72 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  rol.    ** retur
19800 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
19810 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20  that string..   
19820 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19830 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50  ITE_TESTCTRL_EXP
19840 4c 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20 20  LAIN_STMT: {.   
19850 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
19860 2a 70 53 74 6d 74 20 3d 20 76 61 5f 61 72 67 28  *pStmt = va_arg(
19870 61 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ap, sqlite3_stmt
19880 2a 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  *);.      const 
19890 63 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20 76  char **pzRet = v
198a0 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
198b0 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20 2a  char**);.      *
198c0 70 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  pzRet = sqlite3V
198d0 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 28  dbeExplanation((
198e0 56 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20  Vdbe*)pStmt);.  
198f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19900 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 0a 20 20 76  .#endif..  }.  v
19910 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
19920 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
19930 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
19940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19950 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
19960 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65   utility routine
19970 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20  , useful to VFS 
19980 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c  implementations,
19990 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20   that checks.** 
199a0 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61  to see if a data
199b0 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20  base file was a 
199c0 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  URI that contain
199d0 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75  ed a specific qu
199e0 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ery .** paramete
199f0 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74  r, and if so obt
19a00 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  ains the value o
19a10 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61  f the query para
19a20 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
19a30 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
19a40 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e  ent is the filen
19a50 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73  ame pointer pass
19a60 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65  ed into the xOpe
19a70 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  n().** method of
19a80 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74   a VFS implement
19a90 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72  ation.  The zPar
19aa0 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  am argument is t
19ab0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
19ac0 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
19ad0 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73  r we seek.  This
19ae0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
19af0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
19b00 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61  e zParam.** para
19b10 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73  meter if it exis
19b20 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61  ts.  If the para
19b30 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65  meter does not e
19b40 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  xist, this routi
19b50 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  ne.** returns a 
19b60 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
19b70 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
19b80 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
19b90 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
19ba0 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
19bb0 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20  char *zParam){. 
19bc0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
19bd0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
19be0 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
19bf0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
19c00 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77  lename) + 1;.  w
19c10 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b  hile( zFilename[
19c20 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  0] ){.    int x 
19c30 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  = strcmp(zFilena
19c40 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20  me, zParam);.   
19c50 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
19c60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
19c70 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
19c80 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74    if( x==0 ) ret
19c90 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  urn zFilename;. 
19ca0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
19cb0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19cc0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
19cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19cf0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  a boolean value 
19d00 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
19d10 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  meter..*/.int sq
19d20 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
19d30 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
19d40 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
19d50 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74  har *zParam, int
19d60 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74   bDflt){.  const
19d70 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
19d80 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
19d90 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
19da0 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62  am);.  bDflt = b
19db0 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72  Dflt!=0;.  retur
19dc0 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74  n z ? sqlite3Get
19dd0 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74  Boolean(z, bDflt
19de0 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  ) : bDflt;.}../*
19df0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d  .** Return a 64-
19e00 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
19e10 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
19e20 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69  rameter..*/.sqli
19e30 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
19e40 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63  3_uri_int64(.  c
19e50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
19e60 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65  name,    /* File
19e70 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74  name as passed t
19e80 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e  o xOpen */.  con
19e90 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
19ea0 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61         /* URI pa
19eb0 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a  rameter sought *
19ec0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
19ed0 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a  4 bDflt       /*
19ee0 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d   return if param
19ef0 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  eter is missing 
19f00 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
19f10 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
19f20 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46  uri_parameter(zF
19f30 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
19f40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
19f50 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20  4 v;.  if( z && 
19f60 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c  sqlite3Atoi64(z,
19f70 20 26 76 2c 20 73 71 6c 69 74 65 33 53 74 72 6c   &v, sqlite3Strl
19f80 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
19f90 55 54 46 38 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  UTF8)==SQLITE_OK
19fa0 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20   ){.    bDflt = 
19fb0 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  v;.  }.  return 
19fc0 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
19fd0 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65  Return the Btree
19fe0 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66   pointer identif
19ff0 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20  ied by zDbName. 
1a000 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1a010 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74  not found..*/.Bt
1a020 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61  ree *sqlite3DbNa
1a030 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65  meToBtree(sqlite
1a040 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1a050 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
1a060 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1a070 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1a080 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
1a090 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26  b[i].pBt.     &&
1a0a0 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   (zDbName==0 || 
1a0b0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1a0c0 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b  DbName, db->aDb[
1a0d0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20  i].zName)==0).  
1a0e0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1a0f0 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  n db->aDb[i].pBt
1a100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1a110 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1a120 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
1a130 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
1a140 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
1a150 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a  with a database.
1a160 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
1a170 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1a180 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
1a190 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1a1a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1a1b0 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1a1c0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
1a1d0 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1a1e0 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1a1f0 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
1a200 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42  eeGetFilename(pB
1a210 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t) : 0;.}../*.**
1a220 20 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74   Return 1 if dat
1a230 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e  abase is read-on
1a240 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f  ly or 0 if read/
1a250 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d  write.  Return -
1a260 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  1 if.** no such 
1a270 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e  database exists.
1a280 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a290 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69  db_readonly(sqli
1a2a0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1a2b0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1a2c0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71   Btree *pBt = sq
1a2d0 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1a2e0 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1a2f0 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
1a300 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
1a310 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 42 74  adonly(sqlite3Bt
1a320 72 65 65 50 61 67 65 72 28 70 42 74 29 29 20 3a  reePager(pBt)) :
1a330 20 2d 31 3b 0a 7d 0a                              -1;.}.