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

Artifact e974ea9db6214a5f7cb4c1765b49d3aba1e3409f:


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 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** 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 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
6f50: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72  ction is open, r
6f60: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69  oll it back. Thi
6f70: 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74  s also ensures t
6f80: 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20  hat if.  ** any 
6f90: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 73  database schemas
6fa0: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
6fb0: 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d  ied by an uncomm
6fc0: 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
6fd0: 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20  n.  ** they are 
6fe0: 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20  reset. And that 
6ff0: 74 68 65 20 72 65 71 75 69 72 65 64 20 62 2d 74  the required b-t
7000: 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
7010: 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74  d to make.  ** t
7020: 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63  he pager rollbac
7030: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
7040: 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65  et an atomic ope
7050: 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c  ration. */.  sql
7060: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
7070: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
7080: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
7090: 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70  utstanding Savep
70a0: 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e  oint structures.
70b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f   */.  sqlite3Clo
70c0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
70d0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
70e0: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
70f0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28  ctions */.  for(
7100: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
7110: 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  j++){.    struct
7120: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
7130: 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[j];.    if( 
7140: 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pDb->pBt ){.    
7150: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
7160: 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ose(pDb->pBt);. 
7170: 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20       pDb->pBt = 
7180: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d  0;.      if( j!=
7190: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  1 ){.        pDb
71a0: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  ->pSchema = 0;. 
71b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
71c0: 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
71d0: 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61  TEMP schema sepa
71e0: 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20  rately and last 
71f0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  */.  if( db->aDb
7200: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
7210: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
7220: 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d  Clear(db->aDb[1]
7230: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  .pSchema);.  }. 
7240: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
7250: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f  ckList(db);..  /
7260: 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72  * Free up the ar
7270: 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79  ray of auxiliary
7280: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
7290: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
72a0: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
72b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
72c0: 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65  nDb<=2 );.  asse
72d0: 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d  rt( db->aDb==db-
72e0: 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20  >aDbStatic );.. 
72f0: 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64   /* Tell the cod
7300: 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68  e in notify.c th
7310: 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  at the connectio
7320: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64  n no longer hold
7330: 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73  s any.  ** locks
7340: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65   and does not re
7350: 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65  quire any furthe
7360: 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  r unlock-notify 
7370: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
7380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
7390: 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a  ionClosed(db);..
73a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72    for(j=0; j<Arr
73b0: 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63  aySize(db->aFunc
73c0: 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46  .a); j++){.    F
73d0: 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a  uncDef *pNext, *
73e0: 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66  pHash, *p;.    f
73f0: 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61  or(p=db->aFunc.a
7400: 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29  [j]; p; p=pHash)
7410: 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d 20  {.      pHash = 
7420: 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20  p->pHash;.      
7430: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
7440: 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74      functionDest
7450: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  roy(db, p);.    
7460: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
7470: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
7480: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7490: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
74a0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
74b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
74c0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
74d0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
74e0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
74f0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f  Next(i)){.    Co
7500: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
7510: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
7520: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
7530: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64   /* Invoke any d
7540: 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73  estructors regis
7550: 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74  tered for collat
7560: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
7570: 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66  r data. */.    f
7580: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
7590: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
75a0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20  ll[j].xDel ){.  
75b0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78        pColl[j].x
75c0: 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73  Del(pColl[j].pUs
75d0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
75e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
75f0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b  Free(db, pColl);
7600: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
7610: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f  shClear(&db->aCo
7620: 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
7630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7640: 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69  UALTABLE.  for(i
7650: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
7660: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
7670: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
7680: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(i)){.    Mod
7690: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
76a0: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
76b0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
76c0: 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20   pMod->xDestroy 
76d0: 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78  ){.      pMod->x
76e0: 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41  Destroy(pMod->pA
76f0: 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ux);.    }.    s
7700: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7710: 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71   pMod);.  }.  sq
7720: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
7730: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
7740: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45  ndif..  sqlite3E
7750: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
7760: 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c  OK, 0); /* Deall
7770: 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65  ocates any cache
7780: 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e  d error strings.
7790: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45   */.  if( db->pE
77a0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
77b0: 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70  3ValueFree(db->p
77c0: 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Err);.  }.  sqli
77d0: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
77e0: 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d  ns(db);..  db->m
77f0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
7800: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
7810: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
7820: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
7830: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
7840: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
7850: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
7860: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
7870: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
7880: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
7890: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
78a0: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
78b0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
78c0: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
78d0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
78e0: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
78f0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
7900: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
7910: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
7920: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
7930: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
7940: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
7950: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7960: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
7970: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
7980: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
7990: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
79a0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
79b0: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
79c0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
79d0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
79e0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
79f0: 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20  ide.nOut==0 );  
7a00: 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f  /* Fails on a lo
7a10: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c  okaside memory l
7a20: 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  eak */.  if( db-
7a30: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
7a40: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
7a50: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
7a60: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
7a70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7a80: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
7a90: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
7aa0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
7ab0: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
7ac0: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
7ad0: 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75  n.** any open cu
7ae0: 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
7af0: 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22  dated ("tripped"
7b00: 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69   - as in "trippi
7b10: 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20  ng a circuit.** 
7b20: 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61  breaker") and ma
7b30: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69  de to return tri
7b40: 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61  pCode if there a
7b50: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a  re any further.*
7b60: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73  * attempts to us
7b70: 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  e that cursor..*
7b80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
7b90: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
7ba0: 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43  3 *db, int tripC
7bb0: 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ode){.  int i;. 
7bc0: 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30   int inTrans = 0
7bd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7be0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
7bf0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
7c00: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
7c10: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a  nMalloc();..  /*
7c20: 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72   Obtain all b-tr
7c30: 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72  ee mutexes befor
7c40: 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c  e making any cal
7c50: 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62  ls to BtreeRollb
7c60: 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69  ack(). .  ** Thi
7c70: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
7c80: 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
7c90: 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c  action being rol
7ca0: 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a  led back has.  *
7cb0: 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  * modified the d
7cc0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
7cd0: 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  If the b-tree mu
7ce0: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61  texes are not ta
7cf0: 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74  ken.  ** here, t
7d00: 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72  hen another shar
7d10: 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74  ed-cache connect
7d20: 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  ion might sneak 
7d30: 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  in between.  ** 
7d40: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c  the database rol
7d50: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
7d60: 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61   reset, which ca
7d70: 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20  n cause false.  
7d80: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65  ** corruption re
7d90: 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61  ports in some ca
7da0: 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ses.  */.  sqlit
7db0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
7dc0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  db);..  for(i=0;
7dd0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7de0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
7df0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7e00: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
7e10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
7e20: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
7e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72   ){.        inTr
7e40: 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ans = 1;.      }
7e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7e60: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74  reeRollback(p, t
7e70: 72 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  ripCode);.    }.
7e80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
7e90: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20  bRollback(db);. 
7ea0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
7eb0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66  nMalloc();..  if
7ec0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  ( (db->flags&SQL
7ed0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
7ee0: 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69  s)!=0 && db->ini
7ef0: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
7f00: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
7f10: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
7f20: 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
7f30: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
7f40: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
7f50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
7f60: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
7f70: 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65  ;..  /* Any defe
7f80: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
7f90: 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20  violations have 
7fa0: 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  now been resolve
7fb0: 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66  d. */.  db->nDef
7fc0: 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
7fd0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
7fe0: 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d  mCons = 0;.  db-
7ff0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
8000: 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f  E_DeferFKs;..  /
8010: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
8020: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
8030: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
8040: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
8050: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
8060: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
8070: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
8080: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
8090: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
80a0: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
80b0: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
80c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
80d0: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
80e0: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
80f0: 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  e name correspon
8100: 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f  ding to the erro
8110: 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66  r code.** specif
8120: 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ied in the argum
8130: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ent..*/.#if defi
8140: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
8150: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
8160: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 5c 0a 20  ITE_TEST) || \. 
8170: 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54     defined(SQLIT
8180: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
8190: 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  ).const char *sq
81a0: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74  lite3ErrName(int
81b0: 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   rc){.  const ch
81c0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
81d0: 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d   int i, origRc =
81e0: 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   rc;.  for(i=0; 
81f0: 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b  i<2 && zName==0;
8200: 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66   i++, rc &= 0xff
8210: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72  ){.    switch( r
8220: 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  c ){.      case 
8230: 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20  SQLITE_OK:      
8240: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8250: 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20   = "SQLITE_OK"; 
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
8270: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8280: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20   SQLITE_ERROR:  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
82a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
82b0: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
82c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
82d0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
82e0: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
82f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
8300: 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20  ERNAL";         
8310: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8320: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
8340: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
8350: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
8360: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8370: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
8380: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
8390: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
83a0: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20  BORT";          
83b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
83c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
83d0: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20  T_ROLLBACK:     
83e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
83f0: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b  ABORT_ROLLBACK";
8400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8410: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
8420: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
8430: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8440: 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20  _BUSY";         
8450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8460: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
8470: 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20  SY_RECOVERY:    
8480: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8490: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22  E_BUSY_RECOVERY"
84a0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
84b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
84c0: 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20  USY_SNAPSHOT:   
84d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
84e0: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
84f0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8500: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8510: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20  LOCKED:         
8520: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8530: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
8540: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8550: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8560: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
8570: 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CHE: zName = "SQ
8580: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
8590: 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a  EDCACHE";break;.
85a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
85b0: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
85c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
85d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20  QLITE_NOMEM";   
85e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
85f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8600: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20  TE_READONLY:    
8610: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8620: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
8630: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
8640: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8650: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
8660: 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20  OVERY:  zName = 
8670: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
8680: 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61  _RECOVERY"; brea
8690: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
86a0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
86b0: 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  NTLOCK:  zName =
86c0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
86d0: 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65  Y_CANTLOCK"; bre
86e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
86f0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
8700: 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20  OLLBACK:  zName 
8710: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
8720: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  LY_ROLLBACK"; br
8730: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8740: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
8750: 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  :          zName
8760: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
8770: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         b
8780: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8790: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
87b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
87c0: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
87d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
87e0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
87f0: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
8800: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8810: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
8820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8830: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8840: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
8850: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8860: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
8870: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8880: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8890: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
88a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
88b0: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
88c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
88d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
88e0: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
88f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8900: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
8910: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8920: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8930: 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
8940: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8950: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
8960: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8970: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8980: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
8990: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
89a0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
89b0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
89c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
89d0: 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
89e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
89f0: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
8a00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8a10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8a20: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
8a30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8a40: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
8a50: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8a60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8a70: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
8a80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8a90: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
8aa0: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
8ab0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8ac0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
8ad0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8ae0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
8af0: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      break;
8b00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8b10: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
8b20: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
8b30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
8b40: 43 4b 45 44 22 3b 20 20 20 20 20 62 72 65 61 6b  CKED";     break
8b50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8b60: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a  ITE_IOERR_NOMEM:
8b70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8b80: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  "SQLITE_IOERR_NO
8b90: 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61  MEM";       brea
8ba0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8bb0: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
8bc0: 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  S:       zName =
8bd0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41   "SQLITE_IOERR_A
8be0: 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65  CCESS";      bre
8bf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8c00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
8c10: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20  KRESERVEDLOCK:. 
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
8c40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8c50: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
8c60: 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  EDLOCK"; break;.
8c70: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8c80: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20  E_IOERR_LOCK:   
8c90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8ca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
8cb0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
8cc0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8cd0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20  TE_IOERR_CLOSE: 
8ce0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8cf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
8d00: 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  SE";       break
8d10: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8d20: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
8d30: 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  OSE:    zName = 
8d40: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
8d50: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61  R_CLOSE";   brea
8d60: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8d70: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
8d80: 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  EN:      zName =
8d90: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
8da0: 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65  HMOPEN";     bre
8db0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8dc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
8dd0: 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  IZE:      zName 
8de0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8df0: 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72  SHMSIZE";     br
8e00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8e10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
8e20: 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65  LOCK:      zName
8e30: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8e40: 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62  _SHMLOCK";     b
8e50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8e60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
8e70: 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d  MMAP:       zNam
8e80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8e90: 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20  R_SHMMAP";      
8ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8eb0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8ec0: 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EEK:         zNa
8ed0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8ee0: 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20  RR_SEEK";       
8ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8f00: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8f10: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e  DELETE_NOENT: zN
8f20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8f30: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
8f40: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
8f50: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8f60: 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a  _MMAP:         z
8f70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8f80: 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20  OERR_MMAP";     
8f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8fa0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
8fb0: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  UPT:            
8fc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8fd0: 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  CORRUPT";       
8fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8ff0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
9000: 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20  RUPT_VTAB:      
9010: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9020: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20  _CORRUPT_VTAB"; 
9030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9040: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9050: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
9060: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9070: 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20  E_NOTFOUND";    
9080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9090: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
90a0: 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
90b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
90c0: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
90d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
90e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
90f0: 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20  CANTOPEN:       
9100: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9110: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20  ITE_CANTOPEN";  
9120: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9130: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9140: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
9150: 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  DIR: zName = "SQ
9160: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
9170: 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a  TEMPDIR";break;.
9180: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9190: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
91a0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
91b0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
91c0: 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b  SDIR";    break;
91d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
91e0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
91f0: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
9200: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
9210: 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b  FULLPATH"; break
9220: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9230: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20  ITE_PROTOCOL:   
9240: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9250: 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  "SQLITE_PROTOCOL
9260: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
9270: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9280: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
9290: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
92a0: 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b   "SQLITE_EMPTY";
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
92c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
92d0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20  QLITE_SCHEMA:   
92e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
92f0: 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  = "SQLITE_SCHEMA
9300: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9310: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9320: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20  SQLITE_TOOBIG:  
9330: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9340: 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49   = "SQLITE_TOOBI
9350: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  G";            b
9360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9370: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9380: 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  NT:         zNam
9390: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
93a0: 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20  TRAINT";        
93b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
93c0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
93d0: 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61  INT_UNIQUE:  zNa
93e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
93f0: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b  STRAINT_UNIQUE";
9400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9410: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
9420: 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e  AINT_TRIGGER: zN
9430: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
9440: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
9450: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
9460: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9470: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
9480: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
94b0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
94c0: 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61  EIGNKEY";   brea
94d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
94e0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
94f0: 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d  CHECK:   zName =
9500: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9510: 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65  INT_CHECK";  bre
9520: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9530: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9540: 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20  _PRIMARYKEY:.   
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9570: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9580: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
9590: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
95a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
95b0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
95c0: 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  LL: zName = "SQL
95d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
95e0: 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20  OTNULL";break;. 
95f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9600: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
9610: 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20  ITHOOK:.        
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9640: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
9650: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20  NT_COMMITHOOK"; 
9660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9670: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9680: 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a  RAINT_VTAB:    z
9690: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
96a0: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b  ONSTRAINT_VTAB";
96b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
96c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
96d0: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a  TRAINT_FUNCTION:
96e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9710: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
9720: 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  TION";     break
9730: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9740: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
9750: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9760: 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48  "SQLITE_MISMATCH
9770: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
9780: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9790: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
97a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
97b0: 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22   "SQLITE_MISUSE"
97c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
97d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
97e0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
97f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9800: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22  = "SQLITE_NOLFS"
9810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
9820: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9830: 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20  SQLITE_AUTH:    
9840: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9850: 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22   = "SQLITE_AUTH"
9860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
9870: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9880: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20   SQLITE_FORMAT: 
9890: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
98a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d  e = "SQLITE_FORM
98b0: 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  AT";            
98c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
98d0: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
98f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e  me = "SQLITE_RAN
9900: 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  GE";            
9910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9920: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
9930: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
9940: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
9950: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
9960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9970: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9990: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
99a0: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OW";            
99b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
99c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
99d0: 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  CE:             
99e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
99f0: 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20  NOTICE";        
9a00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9a10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
9a20: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a  ICE_RECOVER_WAL:
9a30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a40: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
9a50: 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  WAL";break;.    
9a60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9a70: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
9a80: 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  LBACK:.         
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9ab0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9ac0: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b  COVER_ROLLBACK";
9ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9ae0: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
9af0: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  G:            zN
9b00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
9b10: 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20  RNING";         
9b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9b30: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
9b40: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a  NG_AUTOINDEX:  z
9b50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
9b60: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
9b70: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
9b80: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
9b90: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
9ba0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9bb0: 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20  DONE";          
9bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9bd0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
9be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
9bf0: 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b  c char zBuf[50];
9c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
9c10: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
9c20: 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54  f), zBuf, "SQLIT
9c30: 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20  E_UNKNOWN(%d)", 
9c40: 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61  origRc);.    zNa
9c50: 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  me = zBuf;.  }. 
9c60: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
9c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
9c80: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
9c90: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
9ca0: 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
9cb0: 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
9cc0: 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
9cd0: 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ent..*/.const ch
9ce0: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74  ar *sqlite3ErrSt
9cf0: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61  r(int rc){.  sta
9d00: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  tic const char* 
9d10: 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b  const aMsg[] = {
9d20: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  .    /* SQLITE_O
9d30: 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e  K          */ "n
9d40: 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20  ot an error",.  
9d50: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f    /* SQLITE_ERRO
9d60: 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20  R       */ "SQL 
9d70: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
9d80: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22  issing database"
9d90: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
9da0: 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30  INTERNAL    */ 0
9db0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
9dc0: 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22  PERM        */ "
9dd0: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
9de0: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
9df0: 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20  * SQLITE_ABORT  
9e00: 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63       */ "callbac
9e10: 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72  k requested quer
9e20: 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a  y abort",.    /*
9e30: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20   SQLITE_BUSY    
9e40: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
9e50: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
9e60: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   /* SQLITE_LOCKE
9e70: 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  D      */ "datab
9e80: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
9e90: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
9ea0: 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20  ITE_NOMEM       
9eb0: 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  */ "out of memor
9ec0: 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  y",.    /* SQLIT
9ed0: 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f  E_READONLY    */
9ee0: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69   "attempt to wri
9ef0: 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61  te a readonly da
9f00: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
9f10: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
9f20: 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74     */ "interrupt
9f30: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
9f40: 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a  TE_IOERR       *
9f50: 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  / "disk I/O erro
9f60: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
9f70: 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f  E_CORRUPT     */
9f80: 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   "database disk 
9f90: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
9fa0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
9fb0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a  TE_NOTFOUND    *
9fc0: 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61  / "unknown opera
9fd0: 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51  tion",.    /* SQ
9fe0: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20  LITE_FULL       
9ff0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72   */ "database or
a000: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a   disk is full",.
a010: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41      /* SQLITE_CA
a020: 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e  NTOPEN    */ "un
a030: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
a040: 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20  abase file",.   
a050: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f   /* SQLITE_PROTO
a060: 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69  COL    */ "locki
a070: 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20  ng protocol",.  
a080: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54    /* SQLITE_EMPT
a090: 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c  Y       */ "tabl
a0a0: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  e contains no da
a0b0: 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ta",.    /* SQLI
a0c0: 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a  TE_SCHEMA      *
a0d0: 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65  / "database sche
a0e0: 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c  ma has changed",
a0f0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54  .    /* SQLITE_T
a100: 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73  OOBIG      */ "s
a110: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f  tring or blob to
a120: 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53  o big",.    /* S
a130: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
a140: 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74    */ "constraint
a150: 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a   failed",.    /*
a160: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
a170: 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65      */ "datatype
a180: 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20   mismatch",.    
a190: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  /* SQLITE_MISUSE
a1a0: 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72        */ "librar
a1b0: 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64  y routine called
a1c0: 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65   out of sequence
a1d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a1e0: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
a1f0: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
a200: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
a210: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a220: 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22  AUTH        */ "
a230: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65  authorization de
a240: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
a250: 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20  LITE_FORMAT     
a260: 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64   */ "auxiliary d
a270: 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65  atabase format e
a280: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
a290: 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20  LITE_RANGE      
a2a0: 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c   */ "bind or col
a2b0: 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66  umn index out of
a2c0: 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20   range",.    /* 
a2d0: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20  SQLITE_NOTADB   
a2e0: 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65     */ "file is e
a2f0: 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e  ncrypted or is n
a300: 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a  ot a database",.
a310: 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61    };.  const cha
a320: 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f  r *zErr = "unkno
a330: 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69  wn error";.  swi
a340: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63  tch( rc ){.    c
a350: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
a360: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20  _ROLLBACK: {.   
a370: 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74     zErr = "abort
a380: 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b   due to ROLLBACK
a390: 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";.      break;.
a3a0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
a3b0: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d  t: {.      rc &=
a3c0: 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28   0xff;.      if(
a3d0: 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26   ALWAYS(rc>=0) &
a3e0: 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61  & rc<ArraySize(a
a3f0: 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d  Msg) && aMsg[rc]
a400: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
a410: 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a  Err = aMsg[rc];.
a420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a430: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
a440: 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a   return zErr;.}.
a450: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a460: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ine implements a
a470: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74   busy callback t
a480: 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74  hat sleeps and t
a490: 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e  ries.** again un
a4a0: 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61  til a timeout va
a4b0: 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20  lue is reached. 
a4c0: 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c   The timeout val
a4d0: 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ue is.** an inte
a4e0: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ger number of mi
a4f0: 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65  lliseconds passe
a500: 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73  d in as the firs
a510: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  t.** argument..*
a520: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
a530: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
a540: 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70  llback(. void *p
a550: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
a560: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
a570: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74  nnection */. int
a580: 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20   count          
a590: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a5a0: 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68  of times table h
a5b0: 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a  as been busy */.
a5c0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
a5d0: 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64  _WIN || (defined
a5e0: 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
a5f0: 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20   HAVE_USLEEP).  
a600: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
a610: 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20  delays[] =.     
a620: 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31  { 1, 2, 5, 10, 1
a630: 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20  5, 20, 25, 25,  
a640: 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30  25,  50,  50, 10
a650: 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  0 };.  static co
a660: 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20  nst u8 totals[] 
a670: 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33  =.     { 0, 1, 3
a680: 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33  ,  8, 18, 33, 53
a690: 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20  , 78, 103, 128, 
a6a0: 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65  178, 228 };.# de
a6b0: 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61  fine NDELAY Arra
a6c0: 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20  ySize(delays).  
a6d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
a6e0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
a6f0: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62  int timeout = db
a700: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20  ->busyTimeout;. 
a710: 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f   int delay, prio
a720: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f  r;..  assert( co
a730: 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unt>=0 );.  if( 
a740: 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29  count < NDELAY )
a750: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
a760: 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20  lays[count];.   
a770: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
a780: 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  count];.  }else{
a790: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
a7a0: 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20  ays[NDELAY-1];. 
a7b0: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
a7c0: 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65  s[NDELAY-1] + de
a7d0: 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c  lay*(count-(NDEL
a7e0: 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66  AY-1));.  }.  if
a7f0: 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20  ( prior + delay 
a800: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
a810: 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74   delay = timeout
a820: 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66   - prior;.    if
a830: 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74  ( delay<=0 ) ret
a840: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
a850: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
a860: 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30  pVfs, delay*1000
a870: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
a880: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a  else.  sqlite3 *
a890: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
a8a0: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
a8b0: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
a8c0: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
a8d0: 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74  ut;.  if( (count
a8e0: 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f  +1)*1000 > timeo
a8f0: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
a900: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
a910: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
a920: 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72  s, 1000000);.  r
a930: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
a940: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
a950: 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68  the given busy h
a960: 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  andler..**.** Th
a970: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a980: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65  lled when an ope
a990: 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69  ration failed wi
a9a0: 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66  th a lock..** If
a9b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
a9c0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
a9d0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72  the lock is retr
a9e0: 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72  ied.  If it.** r
a9f0: 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70  eturns 0, the op
aa00: 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77  eration aborts w
aa10: 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55  ith an SQLITE_BU
aa20: 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  SY error..*/.int
aa30: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
aa40: 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61  syHandler(BusyHa
aa50: 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ndler *p){.  int
aa60: 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   rc;.  if( NEVER
aa70: 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75  (p==0) || p->xFu
aa80: 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73  nc==0 || p->nBus
aa90: 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  y<0 ) return 0;.
aaa0: 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28    rc = p->xFunc(
aab0: 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73  p->pArg, p->nBus
aac0: 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  y);.  if( rc==0 
aad0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20  ){.    p->nBusy 
aae0: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
aaf0: 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20     p->nBusy++;. 
ab00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
ab10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ab20: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
ab30: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f  busy callback fo
ab40: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
ab50: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
ab60: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
ab70: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
ab80: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  given argument..
ab90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
aba0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  usy_handler(.  s
abb0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
abc0: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
abd0: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
abe0: 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Arg.){.  sqlite3
abf0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ac00: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62  >mutex);.  db->b
ac10: 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63  usyHandler.xFunc
ac20: 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e   = xBusy;.  db->
ac30: 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67  busyHandler.pArg
ac40: 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62   = pArg;.  db->b
ac50: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
ac60: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
ac70: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73  Timeout = 0;.  s
ac80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ac90: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
aca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
acb0: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
acc0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
acd0: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
ace0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
acf0: 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73  ets the progress
ad00: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
ad10: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
ad20: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
ad30: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
ad40: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
ad50: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  n argument. The 
ad60: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
ad70: 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76  k will.** be inv
ad80: 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20  oked every nOps 
ad90: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64  opcodes..*/.void
ada0: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
adb0: 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  s_handler(.  sql
adc0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
add0: 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78   nOps,.  int (*x
ade0: 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29  Progress)(void*)
adf0: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  , .  void *pArg.
ae00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
ae10: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ae20: 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e  ex);.  if( nOps>
ae30: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  0 ){.    db->xPr
ae40: 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65  ogress = xProgre
ae50: 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f  ss;.    db->nPro
ae60: 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69  gressOps = (unsi
ae70: 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64  gned)nOps;.    d
ae80: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
ae90: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
aea0: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
aeb0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
aec0: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
aed0: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
aee0: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
aef0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
af00: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
af10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
af20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
af30: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
af40: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
af50: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
af60: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
af70: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
af80: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
af90: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
afa0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
afb0: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
afc0: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69  db, int ms){.  i
afd0: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73  f( ms>0 ){.    s
afe0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
aff0: 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65  ler(db, sqliteDe
b000: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
b010: 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20  k, (void*)db);. 
b020: 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f     db->busyTimeo
b030: 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65  ut = ms;.  }else
b040: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
b050: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
b060: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
b070: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b080: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
b090: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
b0a0: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
b0b0: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
b0c0: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
b0d0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
b0e0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
b0f0: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
b100: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
b110: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b120: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
b130: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
b140: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
b150: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
b160: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
b170: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
b180: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
b190: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
b1a0: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
b1b0: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
b1c0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
b1d0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
b1e0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
b1f0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
b200: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
b210: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
b220: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
b230: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
b240: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
b250: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
b260: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
b270: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
b280: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
b290: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
b2a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
b2b0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
b2c0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
b2d0: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
b2e0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
b2f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
b300: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
b310: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
b320: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
b330: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
b340: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
b350: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
b360: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b370: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
b380: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
b390: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
b3a0: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
b3b0: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
b3c0: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
b3d0: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
b3e0: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
b3f0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
b400: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
b410: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
b420: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
b430: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
b440: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
b450: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
b460: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
b470: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
b480: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
b490: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
b4a0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23  E_BKPT;.  }.  .#
b4b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b4c0: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
b4d0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
b4e0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
b4f0: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
b500: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
b510: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
b520: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
b530: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
b540: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
b550: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
b560: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
b570: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
b580: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
b590: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
b5a0: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
b5b0: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
b5c0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
b5d0: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
b5e0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
b5f0: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
b600: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
b610: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
b620: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
b630: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
b640: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
b650: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
b660: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
b670: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
b680: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
b690: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
b6a0: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
b6b0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
b6c0: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
b6d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b6e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b6f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
b700: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
b710: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
b720: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a  SQLITE_UTF16LE,.
b730: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
b740: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
b750: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
b760: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
b770: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b780: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
b790: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
b7a0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
b7b0: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
b7c0: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
b7d0: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
b7e0: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
b7f0: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
b800: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
b810: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
b820: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
b830: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
b840: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
b850: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
b860: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
b870: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
b880: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
b890: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
b8a0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
b8b0: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
b8c0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
b8d0: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
b8e0: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
b8f0: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
b900: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
b910: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
b920: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
b930: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
b940: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
b950: 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45  ( p && p->iPrefE
b960: 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  nc==enc && p->nA
b970: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
b980: 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
b990: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
b9a0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
b9b0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
b9c0: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
b9d0: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
b9e0: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
b9f0: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
ba00: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
ba10: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
ba20: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
ba30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ba40: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
ba50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
ba60: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
ba70: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ents(db);.    }.
ba80: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
ba90: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
baa0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
bab0: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
bac0: 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  u8)enc, 1);.  as
bad0: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
bae0: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
baf0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
bb00: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
bb10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
bb20: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20  n older version 
bb30: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
bb40: 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65  with a configure
bb50: 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  d destructor is.
bb60: 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61    ** being repla
bb70: 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  ced invoke the d
bb80: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
bb90: 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75  on here. */.  fu
bba0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
bbb0: 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65  , p);..  if( pDe
bbc0: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
bbd0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
bbe0: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44  f++;.  }.  p->pD
bbf0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73  estructor = pDes
bc00: 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c  tructor;.  p->fl
bc10: 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46  ags = 0;.  p->xF
bc20: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
bc30: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
bc40: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
bc50: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
bc60: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
bc70: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
bc80: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
bc90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
bcb0: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
bcc0: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
bcd0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
bce0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
bcf0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
bd00: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
bd10: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
bd20: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
bd30: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
bd40: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
bd50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
bd60: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
bd70: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
bd80: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
bd90: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
bda0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
bdb0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
bdc0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
bdd0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
bde0: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
bdf0: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
be00: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
be40: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
be50: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
be60: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
be70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
be80: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
be90: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
bea0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
beb0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
bec0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
bed0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
bee0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
bef0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
bf00: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
bf10: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
bf20: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
bf30: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
bf40: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
bf50: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
bf60: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
bf70: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
bf80: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71   *pArg = 0;.  sq
bf90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
bfa0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
bfb0: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
bfc0: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
bfd0: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
bfe0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
bff0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
c000: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
c010: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
c020: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
c030: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
c040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
c050: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
c060: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
c070: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
c080: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
c090: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c0a0: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
c0b0: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
c0c0: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67  ep, xFinal, pArg
c0d0: 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26  );.  if( pArg &&
c0e0: 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29   pArg->nRef==0 )
c0f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
c100: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
c110: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
c120: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c130: 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d  e(db, pArg);.  }
c140: 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73  .. out:.  rc = s
c150: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
c160: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
c170: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c180: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c190: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
c1a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
c1b0: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
c1c0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
c1d0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
c1e0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
c1f0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
c200: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
c210: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
c220: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
c230: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
c240: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c250: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c260: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c270: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c280: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
c290: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
c2a0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
c2b0: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
c2c0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
c2d0: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
c2e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
c2f0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
c300: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c310: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
c320: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
c330: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
c340: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
c350: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
c360: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
c370: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
c380: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
c390: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
c3a0: 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71   xFinal,0);.  sq
c3b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c3c0: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
c3d0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
c3e0: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
c3f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
c400: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
c410: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
c420: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
c430: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
c440: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
c450: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
c460: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
c470: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
c480: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
c490: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
c4a0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
c4b0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
c4c0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
c4d0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
c4e0: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
c4f0: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
c500: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
c510: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
c520: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
c530: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
c540: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
c550: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
c560: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
c570: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
c580: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
c590: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
c5a0: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
c5b0: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
c5c0: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
c5d0: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
c5e0: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
c5f0: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
c600: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
c610: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
c620: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
c630: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c640: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
c650: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
c660: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
c670: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c680: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  Name);.  int rc 
c690: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
c6a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
c6b0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
c6c0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
c6d0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
c6e0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
c6f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
c700: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
c710: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
c720: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
c730: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
c760: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
c770: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
c780: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
c790: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
c7a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
c7b0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
c7c0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
c7d0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
c7e0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
c7f0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
c800: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
c810: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
c820: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
c830: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
c840: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
c850: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
c860: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
c870: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
c880: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
c890: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
c8a0: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
c8b0: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
c8c0: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
c8d0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
c8e0: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
c8f0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
c900: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
c910: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
c920: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
c930: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
c940: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
c950: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
c960: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
c970: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
c980: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
c990: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
c9a0: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
c9b0: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
c9c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
c9d0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
c9e0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
c9f0: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
ca00: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
ca10: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
ca20: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
ca30: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
ca40: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
ca50: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
ca60: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
ca70: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
ca80: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
ca90: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
caa0: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
cab0: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
cac0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
cad0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
cae0: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
caf0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
cb00: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
cb10: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
cb20: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
cb30: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
cb40: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
cb50: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
cb60: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
cb70: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
cb80: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
cb90: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
cba0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
cbb0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
cbc0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
cbd0: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
cbe0: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
cbf0: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
cc00: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
cc10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
cc20: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
cc30: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
cc40: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
cc50: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
cc60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
cc70: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
cc80: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
cc90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
cca0: 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mits..** If the 
ccb0: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
ccc0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
ccd0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
cce0: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
ccf0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
cd00: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
cd10: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
cd20: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
cd30: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
cd40: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
cd50: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
cd60: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
cd70: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
cd80: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
cd90: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
cda0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
cdb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
cdc0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
cdd0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
cde0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
cdf0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ce00: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
ce10: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
ce20: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
ce30: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
ce40: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
ce50: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
ce60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ce70: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ce80: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
ce90: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
cea0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
ceb0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
cec0: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
ced0: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
cee0: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
cef0: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
cf00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
cf10: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
cf20: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
cf30: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
cf40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
cf50: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
cf60: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
cf70: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
cf80: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
cf90: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
cfa0: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
cfb0: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
cfc0: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
cfd0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
cfe0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
cff0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
d000: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
d010: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d020: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
d030: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
d040: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
d050: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
d060: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
d070: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
d080: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d090: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d0a0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
d0b0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
d0c0: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
d0d0: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
d0e0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
d0f0: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
d100: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
d110: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
d120: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
d130: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
d140: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
d160: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
d170: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
d180: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
d190: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
d1a0: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
d1b0: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
d1c0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d1d0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
d1e0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
d1f0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
d200: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d210: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d220: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
d230: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
d240: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
d250: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d260: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
d270: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
d280: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d290: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d2a0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
d2b0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
d2c0: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
d2d0: 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67  E_HOOK./*.** Reg
d2e0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
d2f0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
d300: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
d310: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
d320: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
d330: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
d340: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d350: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
d360: 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f  e3_preupdate_hoo
d370: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
d380: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d390: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
d3a0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
d3b0: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43  se */.  void(*xC
d3c0: 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20 20 20  allback)(       
d3d0: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75    /* Callback fu
d3e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f  nction */.    vo
d3f0: 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
d400: 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61  ,char const*,cha
d410: 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33  r const*,sqlite3
d420: 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f 69  _int64,sqlite3_i
d430: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
d440: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
d450: 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c     /* First call
d460: 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f  back argument */
d470: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
d480: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d490: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d4a0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
d4b0: 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 3b 0a  >pPreUpdateArg;.
d4c0: 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65    db->xPreUpdate
d4d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
d4e0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65  back;.  db->pPre
d4f0: 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67  UpdateArg = pArg
d500: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d510: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d520: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
d530: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
d540: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
d550: 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a  UPDATE_HOOK */..
d560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d570: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
d580: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  e sqlite3_wal_ho
d590: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65  ok() callback re
d5a0: 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69  gistered by sqli
d5b0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
d5c0: 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76  kpoint()..** Inv
d5d0: 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  oke sqlite3_wal_
d5e0: 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
d5f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
d600: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
d610: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
d620: 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57   than sqlite3.pW
d630: 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e  alArg cast to an
d640: 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61   integer (the va
d650: 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62  lue configured b
d660: 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65  y.** wal_autoche
d670: 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a  ckpoint())..*/ .
d680: 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65  int sqlite3WalDe
d690: 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69  faultHook(.  voi
d6a0: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20  d *pClientData, 
d6b0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
d6c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d6d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
d6e0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
d6f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
d700: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
d710: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d  e */.  int nFram
d720: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
d730: 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a   Size of WAL */.
d740: 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  ){.  if( nFrame>
d750: 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  =SQLITE_PTR_TO_I
d760: 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20  NT(pClientData) 
d770: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
d780: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
d790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
d7a0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  al_checkpoint(db
d7b0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , zDb);.    sqli
d7c0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
d7d0: 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oc();.  }.  retu
d7e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d7f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d800: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
d810: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e  .** Configure an
d820: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
d830: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  k() callback to 
d840: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68  automatically ch
d850: 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61  eckpoint.** a da
d860: 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d  tabase after com
d870: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
d880: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ction if there a
d890: 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20  re nFrame or.** 
d8a0: 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74  more frames in t
d8b0: 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73  he log file. Pas
d8c0: 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e  sing zero or a n
d8d0: 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73  egative value as
d8e0: 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70   the.** nFrame p
d8f0: 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65  arameter disable
d900: 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  s automatic chec
d910: 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79  kpoints entirely
d920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
d930: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
d940: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
d950: 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78   replaces any ex
d960: 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a  isting callback.
d970: 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73  ** registered us
d980: 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
d990: 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65  hook(). Likewise
d9a0: 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  , registering a 
d9b0: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  callback.** usin
d9c0: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
d9d0: 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68  ok() disables th
d9e0: 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  e automatic chec
d9f0: 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d  kpoint mechanism
da00: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62  .** configured b
da10: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
da20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
da30: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
da40: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
da50: 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66  int nFrame){.#if
da60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
da70: 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  WAL.  UNUSED_PAR
da80: 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
da90: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
daa0: 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20  Frame);.#else.  
dab0: 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
dac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
dad0: 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
dae0: 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
daf0: 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
db00: 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
db10: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
db20: 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
db30: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
db40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
db50: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
db60: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
db70: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
db80: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
db90: 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
dba0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
dbb0: 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
dbc0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
dbd0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
dbe0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
dbf0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
dc00: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
dc10: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
dc20: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
dc30: 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
dc40: 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
dc50: 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
dc60: 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
dc70: 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
dc80: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
dc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
dca0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
dcb0: 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
dcc0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
dcd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
dce0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
dcf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
dd00: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
dd10: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c   pRet = db->pWal
dd20: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43  Arg;.  db->xWalC
dd30: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
dd40: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41  ack;.  db->pWalA
dd50: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
dd60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
dd70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
dd80: 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73  eturn pRet;.#els
dd90: 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
dda0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
ddb0: 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
ddc0: 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e zDb..*/.int sq
ddd0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
dde0: 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74  oint_v2(.  sqlit
ddf0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
de00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
de10: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
de20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
de30: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
de40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74     /* Name of at
de50: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
de60: 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69  (or NULL) */.  i
de70: 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20  nt eMode,       
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de90: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  * SQLITE_CHECKPO
dea0: 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  INT_* value */. 
deb0: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20   int *pnLog,    
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
dee0: 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d   WAL log in fram
def0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  es */.  int *pnC
df00: 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20  kpt             
df10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
df20: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
df30: 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e  frames checkpoin
df40: 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66  ted */.){.#ifdef
df50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
df60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
df70: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  _OK;.#else.  int
df80: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dfa0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
dfb0: 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54   int iDb = SQLIT
dfc0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20  E_MAX_ATTACHED; 
dfd0: 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b   /* sqlite3.aDb[
dfe0: 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f  ] index of db to
dff0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a   checkpoint */..
e000: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
e010: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
e020: 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61  bles to -1 in ca
e030: 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
e040: 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c  rs. */.  if( pnL
e050: 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31  og ) *pnLog = -1
e060: 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29  ;.  if( pnCkpt )
e070: 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a   *pnCkpt = -1;..
e080: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
e090: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
e0a0: 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  >SQLITE_CHECKPOI
e0b0: 4e 54 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20  NT_PASSIVE );.  
e0c0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
e0d0: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53  HECKPOINT_FULL<S
e0e0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e0f0: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73  _RESTART );.  as
e100: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
e110: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b  CKPOINT_PASSIVE+
e120: 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  2==SQLITE_CHECKP
e130: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a  OINT_RESTART );.
e140: 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49    if( eMode<SQLI
e150: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
e160: 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53  SSIVE || eMode>S
e170: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e180: 5f 52 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20  _RESTART ){.    
e190: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e1a0: 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  SUSE;.  }..  sql
e1b0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
e1c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
e1d0: 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d  f( zDb && zDb[0]
e1e0: 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   ){.    iDb = sq
e1f0: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
e200: 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  db, zDb);.  }.  
e210: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
e220: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e230: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
e240: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
e250: 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20  ERROR, "unknown 
e260: 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
e270: 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Db);.  }else{.  
e280: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
e290: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62  eckpoint(db, iDb
e2a0: 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
e2b0: 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c  pnCkpt);.    sql
e2c0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
e2d0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  , 0);.  }.  rc =
e2e0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e2f0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e300: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e310: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e320: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
e330: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  .../*.** Checkpo
e340: 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
e350: 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c  . If zDb is NULL
e360: 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66  , or if the buff
e370: 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a  er zDb points.**
e380: 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a   to contains a z
e390: 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e  ero-length strin
e3a0: 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  g, all attached 
e3b0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a  databases are .*
e3c0: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  * checkpointed..
e3d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
e3e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  al_checkpoint(sq
e3f0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
e400: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72   char *zDb){.  r
e410: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61  eturn sqlite3_wa
e420: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
e430: 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
e440: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
e450: 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69  VE, 0, 0);.}..#i
e460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e470: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  T_WAL./*.** Run 
e480: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20  a checkpoint on 
e490: 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68  database iDb. Th
e4a0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
e4b0: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73   database iDb is
e4c0: 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  .** not currentl
e4d0: 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  y open in WAL mo
e4e0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  de..**.** If a t
e4f0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
e500: 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
e510: 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  se being checkpo
e520: 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20  inted, this .** 
e530: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
e540: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61   SQLITE_LOCKED a
e550: 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  nd a checkpoint 
e560: 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
e570: 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
e580: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
e590: 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b  unning the check
e5a0: 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65  point, an SQLite
e5b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
e5c0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65  ** returned (i.e
e5d0: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e  . SQLITE_IOERR).
e5e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
e5f0: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
e600: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
e610: 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f  se handle db sho
e620: 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74  uld be held by t
e630: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d  he caller. The m
e640: 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74  utex.** associat
e650: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
e660: 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e  ific b-tree bein
e670: 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69  g checkpointed i
e680: 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68  s taken by.** th
e690: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  is function whil
e6a0: 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
e6b0: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a   is running..**.
e6c0: 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73  ** If iDb is pas
e6d0: 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  sed SQLITE_MAX_A
e6e0: 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c  TTACHED, then al
e6f0: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
e700: 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63  ases are.** chec
e710: 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20  kpointed. If an 
e720: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
e730: 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72  ered it is retur
e740: 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ned immediately 
e750: 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20  -.** no attempt 
e760: 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
e770: 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e  point any remain
e780: 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ing databases..*
e790: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
e7a0: 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53  Mode is one of S
e7b0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e7c0: 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f  _PASSIVE, FULL o
e7d0: 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e  r RESTART..*/.in
e7e0: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  t sqlite3Checkpo
e7f0: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
e800: 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d   int iDb, int eM
e810: 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  ode, int *pnLog,
e820: 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20   int *pnCkpt){. 
e830: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e840: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e850: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
e860: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
e890: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
e8a0: 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a  attached dbs */.
e8b0: 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b    int bBusy = 0;
e8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c    /* True if SQL
e8e0: 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65 65  ITE_BUSY has bee
e8f0: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  n encountered */
e900: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
e910: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
e920: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
e930: 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c  ssert( !pnLog ||
e940: 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20   *pnLog==-1 );. 
e950: 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74   assert( !pnCkpt
e960: 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20   || *pnCkpt==-1 
e970: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
e980: 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d  <db->nDb && rc==
e990: 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
e9a0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20  .    if( i==iDb 
e9b0: 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d  || iDb==SQLITE_M
e9c0: 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20  AX_ATTACHED ){. 
e9d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e9e0: 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74  3BtreeCheckpoint
e9f0: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c  (db->aDb[i].pBt,
ea00: 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
ea10: 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e  nCkpt);.      pn
ea20: 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Log = 0;.      p
ea30: 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20  nCkpt = 0;.     
ea40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ea50: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
ea60: 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20  bBusy = 1;.     
ea70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
ea80: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
ea90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
eaa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
eab0: 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45   bBusy) ? SQLITE
eac0: 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65  _BUSY : rc;.}.#e
ead0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
eae0: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
eaf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
eb00: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
eb10: 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75  main-memory shou
eb20: 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ld be used inste
eb30: 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  ad of.** a tempo
eb40: 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72  rary file for tr
eb50: 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69  ansient pager fi
eb60: 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  les and statemen
eb70: 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  t journals..** T
eb80: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
eb90: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
eba0: 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65   value of db->te
ebb0: 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d  mp_store (runtim
ebc0: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20  e.** parameter) 
ebd0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20  and the compile 
ebe0: 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51  time value of SQ
ebf0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e  LITE_TEMP_STORE.
ec00: 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
ec10: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
ec20: 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  s the relationsh
ec30: 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65  ip between these
ec40: 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61   two values.** a
ec50: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
ec60: 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a  s return value..
ec70: 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54  **.**   SQLITE_T
ec80: 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62  EMP_STORE     db
ec90: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20  ->temp_store    
eca0: 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d   Location of tem
ecb0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a  porary database.
ecc0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
ecd0: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
ece0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
ecf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
ed10: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
ed20: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
ed30: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
ed40: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
ed50: 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
ed60: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
ed80: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
ed90: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
edd0: 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 1).**   1    
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
ee00: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
ee10: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
ee40: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
ee50: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
ee60: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
ee70: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
ee80: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
ee90: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
eea0: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
eeb0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
eed0: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
eee0: 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20  ).**   3        
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
ef20: 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n 1).*/.int sqli
ef30: 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
ef40: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64  const sqlite3 *d
ef50: 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  b){.#if SQLITE_T
ef60: 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72  EMP_STORE==1.  r
ef70: 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70  eturn ( db->temp
ef80: 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e  _store==2 );.#en
ef90: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
efa0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72  EMP_STORE==2.  r
efb0: 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70  eturn ( db->temp
efc0: 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e  _store!=1 );.#en
efd0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
efe0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72  EMP_STORE==3.  r
eff0: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
f000: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
f010: 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54  STORE<1 || SQLIT
f020: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20  E_TEMP_STORE>3. 
f030: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
f040: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
f050: 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  n UTF-8 encoded 
f060: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
f070: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
f080: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
f090: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
f0a0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
f0b0: 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20  _errmsg(sqlite3 
f0c0: 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
f0d0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  ar *z;.  if( !db
f0e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
f0f0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
f100: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a  ITE_NOMEM);.  }.
f110: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
f120: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
f130: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
f140: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
f150: 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  r(SQLITE_MISUSE_
f160: 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  BKPT);.  }.  sql
f170: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f180: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
f190: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f1a0: 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73  led ){.    z = s
f1b0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
f1c0: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65  ITE_NOMEM);.  }e
f1d0: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 28 63 68  lse{.    z = (ch
f1e0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
f1f0: 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
f200: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
f210: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f220: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
f230: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
f240: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
f250: 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
f260: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f270: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f280: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
f290: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f2a0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
f2b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
f2c0: 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
f2d0: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
f2e0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
f2f0: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
f300: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
f310: 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
f320: 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
f330: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
f340: 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
f350: 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
f360: 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
f370: 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
f380: 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
f390: 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
f3a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f3b0: 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
f3c0: 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62      'l', 'i', 'b
f3d0: 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27  ', 'r', 'a', 'r'
f3e0: 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'y', ' ', .   
f3f0: 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20   'r', 'o', 'u', 
f400: 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27  't', 'i', 'n', '
f410: 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63  e', ' ', .    'c
f420: 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27  ', 'a', 'l', 'l'
f430: 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'e', 'd', ' ',
f440: 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20   .    'o', 'u', 
f450: 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  't', ' ', .    '
f460: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20  o', 'f', ' ', . 
f470: 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27     's', 'e', 'q'
f480: 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c  , 'u', 'e', 'n',
f490: 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   'c', 'e', 0.  }
f4a0: 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
f4b0: 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
f4c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
f4d0: 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
f4e0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
f4f0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
f500: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
f510: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
f520: 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
f530: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f540: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
f550: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f560: 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
f570: 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
f580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
f590: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f5a0: 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
f5b0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
f5c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
f5d0: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
f5e0: 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45  rr, -1, sqlite3E
f5f0: 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
f600: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 53  e),.           S
f610: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
f620: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
f630: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
f640: 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
f650: 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
f660: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61  /* A malloc() ma
f670: 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69  y have failed wi
f680: 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f  thin the call to
f690: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f6a0: 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61  ext16().    ** a
f6b0: 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73  bove. If this is
f6c0: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
f6d0: 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
f6e0: 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20  iled flag needs 
f6f0: 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65  to.    ** be cle
f700: 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ared before retu
f710: 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64  rning. Do this d
f720: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
f730: 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73   of via.    ** s
f740: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c  qlite3ApiExit(),
f750: 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e   to avoid settin
f760: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  g the database h
f770: 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  andle error mess
f780: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
f790: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f7a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
f7b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f7c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f7d0: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
f7e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f7f0: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
f800: 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
f810: 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
f820: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
f830: 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
f840: 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
f850: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
f860: 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
f870: 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
f880: 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
f890: 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
f8a0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
f8b0: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
f8c0: 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
f8d0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f8e0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
f8f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f900: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f910: 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
f920: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f940: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f950: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
f960: 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d  rCode & db->errM
f970: 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ask;.}.int sqlit
f980: 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
f990: 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
f9a0: 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
f9b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f9c0: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
f9d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f9e0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f9f0: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
fa00: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
fa10: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
fa20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fa30: 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
fa40: 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
fa50: 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
fa60: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
fa70: 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
fa80: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
fa90: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  he.** argument. 
faa0: 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73   For now, this s
fab0: 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20  imply calls the 
fac0: 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33  internal sqlite3
fad0: 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63  ErrStr().** func
fae0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
faf0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
fb00: 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72  str(int rc){.  r
fb10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
fb20: 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str(rc);.}../*.*
fb30: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
fb40: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
fb50: 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22  n for database "
fb60: 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69  db".  The name i
fb70: 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74  s zName.** and t
fb80: 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65  he encoding is e
fb90: 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nc..*/.static in
fba0: 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  t createCollatio
fbb0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
fbc0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
fbd0: 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63  zName, .  u8 enc
fbe0: 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a  ,.  void* pCtx,.
fbf0: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
fc00: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
fc10: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
fc20: 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
fc30: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
fc40: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
fc50: 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20  l;.  int enc2;. 
fc60: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
fc70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
fc80: 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  me);.  .  assert
fc90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fca0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
fcb0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
fcc0: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
fcd0: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
fce0: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
fcf0: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
fd00: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
fd10: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
fd20: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
fd30: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
fd40: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
fd50: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
fd60: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
fd70: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
fd80: 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
fd90: 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
fda0: 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
fdb0: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
fdc0: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
fdd0: 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
fde0: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
fdf0: 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
fe00: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
fe10: 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
fe20: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
fe30: 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
fe40: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
fe50: 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
fe60: 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
fe70: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
fe80: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
fe90: 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
fea0: 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
feb0: 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
fec0: 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
fed0: 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
fee0: 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
fef0: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
ff00: 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
ff10: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
ff20: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
ff30: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
ff40: 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
ff50: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
ff60: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
ff70: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
ff80: 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
ff90: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
ffa0: 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
ffb0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
ffc0: 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
ffd0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
ffe0: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
fff0: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
10000 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
10010 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
10020 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69  ence due to acti
10030 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
10040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10050 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
10060 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
10070 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
10080 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f  ents(db);..    /
10090 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  * If collation s
100a0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61  equence pColl wa
100b0 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74  s created direct
100c0 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ly by a call to.
100d0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
100e0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c  reate_collation,
100f0 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74   and not generat
10100 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  ed by synthCollS
10110 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65  eq(),.    ** the
10120 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64  n any copies mad
10130 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  e by synthCollSe
10140 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69  q() need to be i
10150 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20  nvalidated..    
10160 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69  ** Also, collati
10170 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20  on destructor - 
10180 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d  CollSeq.xDel() -
10190 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65   function may ne
101a0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
101b0 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a  called..    */ .
101c0 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e      if( (pColl->
101d0 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
101e0 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e  F16_ALIGNED)==en
101f0 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  c2 ){.      Coll
10200 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *aColl = sql
10210 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
10220 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
10230 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, nName);.     
10240 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
10250 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
10260 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
10270 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d  q *p = &aColl[j]
10280 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
10290 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
102a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
102b0 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20  ( p->xDel ){.   
102c0 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c           p->xDel
102d0 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  (p->pUser);.    
102e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
102f0 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20    p->xCmp = 0;. 
10300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10310 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
10320 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
10330 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
10340 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29  )enc2, zName, 1)
10350 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
10360 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10370 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d  _NOMEM;.  pColl-
10380 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65  >xCmp = xCompare
10390 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  ;.  pColl->pUser
103a0 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c   = pCtx;.  pColl
103b0 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20  ->xDel = xDel;. 
103c0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75   pColl->enc = (u
103d0 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26  8)(enc2 | (enc &
103e0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
103f0 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74  IGNED));.  sqlit
10400 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
10410 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74  TE_OK, 0);.  ret
10420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10430 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72  .../*.** This ar
10440 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64  ray defines hard
10450 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e   upper bounds on
10460 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20   limit values.  
10470 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  The.** initializ
10480 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20  er must be kept 
10490 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
104a0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a   SQLITE_LIMIT_*.
104b0 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73  ** #defines in s
104c0 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61  qlite3.h..*/.sta
104d0 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48  tic const int aH
104e0 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  ardLimit[] = {. 
104f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
10500 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
10510 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _SQL_LENGTH,.  S
10520 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
10530 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ,.  SQLITE_MAX_E
10540 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  XPR_DEPTH,.  SQL
10550 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
10560 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54  _SELECT,.  SQLIT
10570 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20  E_MAX_VDBE_OP,. 
10580 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
10590 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49  TION_ARG,.  SQLI
105a0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
105b0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  .  SQLITE_MAX_LI
105c0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
105d0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
105e0 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
105f0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
10600 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a  IGGER_DEPTH,.};.
10610 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
10620 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
10630 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
10640 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
10650 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10660 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
10670 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
10680 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
10690 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
106a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
106b0 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
106c0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
106d0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
106e0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
106f0 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
10700 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10710 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
10720 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
10730 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10740 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
10750 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
10760 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
10770 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10780 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
10790 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
107a0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
107b0 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
107c0 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
107d0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
107e0 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
107f0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10800 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
10810 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
10820 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
10830 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
10840 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
10850 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30  UNCTION_ARG>1000
10860 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10870 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
10880 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
10890 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64   0 and 1000.#end
108a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
108b0 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
108c0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
108d0 48 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53  HED>62.# error S
108e0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
108f0 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
10900 65 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64  en 0 and 62.#end
10910 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
10920 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
10930 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
10940 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
10950 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
10960 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
10970 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
10980 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33  ITE_MAX_COLUMN>3
10990 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  2767.# error SQL
109a0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d  ITE_MAX_COLUMN m
109b0 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33  ust not exceed 3
109c0 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20  2767.#endif.#if 
109d0 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
109e0 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72  ER_DEPTH<1.# err
109f0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  or SQLITE_MAX_TR
10a00 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74  IGGER_DEPTH must
10a10 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
10a20 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
10a30 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
10a40 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f  f a limit.  Repo
10a50 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
10a60 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c  ..** If an inval
10a70 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69  id limit index i
10a80 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f  s supplied, repo
10a90 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e  rt -1..** Make n
10aa0 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74  o changes but st
10ab0 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f  ill report the o
10ac0 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a  ld value if the.
10ad0 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20  ** new limit is 
10ae0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
10af0 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69  A new lower limi
10b00 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e  t does not shrin
10b10 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74  k existing const
10b20 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72  ructs..** It mer
10b30 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ely prevents new
10b40 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74   constructs that
10b50 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69   exceed the limi
10b60 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e  t.** from formin
10b70 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
10b80 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20  3_limit(sqlite3 
10b90 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64  *db, int limitId
10ba0 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b  , int newLimit){
10bb0 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b  .  int oldLimit;
10bc0 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ...  /* EVIDENCE
10bd0 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
10be0 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
10bf0 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
10c00 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
10c10 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
10c20 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
10c30 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
10c40 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
10c50 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
10c60 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
10c70 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
10c80 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
10c90 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
10ca0 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
10cb0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10cc0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
10cd0 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
10ce0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
10cf0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
10d00 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
10d10 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
10d20 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
10d30 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
10d40 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
10d50 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
10d60 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
10d70 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
10d80 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
10d90 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
10da0 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
10db0 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
10dc0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
10dd0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
10de0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
10df0 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
10e00 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
10e10 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
10e20 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10e30 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
10e40 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
10e50 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
10e60 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
10e70 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
10e80 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
10e90 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
10ea0 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
10eb0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
10ec0 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
10ed0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
10ee0 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
10ef0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
10f00 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
10f10 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
10f20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
10f60 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
10f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
10f80 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
10f90 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
10fa0 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
10fb0 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
10fc0 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
10fd0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
10fe0 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
10ff0 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
11000 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
11010 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
11020 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
11030 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f  _DEPTH==(SQLITE_
11040 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
11050 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
11060 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
11070 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
11080 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
11090 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
110a0 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
110b0 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
110c0 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
110d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
110e0 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
110f0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
11100 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
11110 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
11120 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
11130 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
11140 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
11150 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
11160 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
11170 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
11180 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
11190 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
111c0 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  35419 */.}../*.*
111d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
111e0 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
111f0 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
11200 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
11210 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
11220 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
11230 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
11240 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
11250 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
11260 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
11270 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
11280 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
11290 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
112a0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
112b0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
112c0 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
112d0 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
112e0 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
112f0 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
11300 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
11310 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
11320 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
11330 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
11340 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
11350 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11360 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
11370 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
11380 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
11390 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
113a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
113b0 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
113c0 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
113d0 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
113e0 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
113f0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
11400 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
11410 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
11420 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
11430 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
11440 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
11450 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
11460 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
11470 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
11480 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
11490 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
114a0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
114b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
114c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
114d0 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
114e0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
114f0 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
11500 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
11510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11520 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
11530 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
11540 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
11550 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
11560 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
11570 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
11580 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
11590 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
115a0 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
115b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
115c0 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
115d0 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
115e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
115f0 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
11600 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
11610 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
11620 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
11630 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
11640 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
11650 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
11660 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
11670 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
11680 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
11690 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
116a0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
116b0 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
116c0 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
116d0 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
116e0 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
116f0 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
11700 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
11710 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
11720 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
11730 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
11740 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
11750 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11770 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
11780 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
11790 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
117a0 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
117b0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
117c0 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
117d0 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
117e0 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
117f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
11800 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
11810 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
11840 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
11850 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
11860 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
11870 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
11880 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
11890 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
118a0 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
118b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
118c0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
118d0 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
118e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
118f0 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
11900 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
11910 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
11920 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
11930 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
11940 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
11950 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
11960 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
11970 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c  OPEN_URI) || sql
11980 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
11990 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26  .bOpenUri) .   &
119a0 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d  & nUri>=5 && mem
119b0 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a  cmp(zUri, "file:
119c0 22 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  ", 5)==0 .  ){. 
119d0 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
119e0 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
11a10 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
11a20 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
11a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11a40 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
11a50 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
11a60 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
11a70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11a80 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
11a90 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
11aa0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
11ab0 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
11ac0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
11ad0 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
11ae0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
11af0 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
11b00 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
11b10 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
11b20 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
11b30 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
11b40 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
11b50 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
11b60 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
11b70 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
11b80 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
11b90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
11ba0 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
11bb0 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
11bc0 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
11bd0 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
11be0 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
11bf0 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
11c00 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
11c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11c20 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69  OMEM;..    /* Di
11c30 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65  scard the scheme
11c40 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73   and authority s
11c50 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55  egments of the U
11c60 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  RI. */.    if( z
11c70 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a  Uri[5]=='/' && z
11c80 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20  Uri[6]=='/' ){. 
11c90 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
11ca0 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
11cb0 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
11cc0 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='/' ) iIn++;.
11cd0 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d  .      if( iIn!=
11ce0 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c  7 && (iIn!=16 ||
11cf0 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f   memcmp("localho
11d00 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39  st", &zUri[7], 9
11d10 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  )) ){.        *p
11d20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
11d30 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c  3_mprintf("inval
11d40 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79  id uri authority
11d50 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20  : %.*s", .      
11d60 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55        iIn-7, &zU
11d70 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20  ri[7]);.        
11d80 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
11d90 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
11da0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
11db0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11dc0 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 35 3b  {.      iIn = 5;
11dd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
11de0 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  opy the filename
11df0 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70   and any query p
11e00 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74  arameters into t
11e10 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e  he zFile buffer.
11e20 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20   .    ** Decode 
11e30 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73  %HH escape codes
11e40 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20   along the way. 
11e50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
11e60 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c  ithin this loop,
11e70 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65   variable eState
11e80 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30   may be set to 0
11e90 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64  , 1 or 2, depend
11ea0 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ing.    ** on th
11eb0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
11ec0 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  t. As follows:. 
11ed0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30     **.    **   0
11ee0 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e  : Parsing file-n
11ef0 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a  ame..    **   1:
11f00 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65   Parsing name se
11f10 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
11f20 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
11f30 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  meter..    **   
11f40 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65  2: Parsing value
11f50 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
11f60 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
11f70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f  arameter..    */
11f80 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b  .    eState = 0;
11f90 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
11fa0 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
11fb0 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20  & c!='#' ){.    
11fc0 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69    iIn++;.      i
11fd0 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20  f( c=='%' .     
11fe0 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
11ff0 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20  igit(zUri[iIn]) 
12000 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
12010 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
12020 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29  iIn+1]) .      )
12030 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63  {.        int oc
12040 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65  tet = (sqlite3He
12050 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
12060 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20  +]) << 4);.     
12070 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69     octet += sqli
12080 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
12090 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20  [iIn++]);..     
120a0 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74     assert( octet
120b0 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36  >=0 && octet<256
120c0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
120d0 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  octet==0 ){.    
120e0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
120f0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
12100 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73  en "%00" appears
12110 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e   within the URI.
12120 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   In this.       
12130 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67     ** case we ig
12140 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e  nore all text in
12150 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
12160 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65  f the path, name
12170 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
12180 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
12190 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53   being parsed. S
121a0 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72  o ignore the cur
121b0 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20  rent character. 
121c0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
121d0 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74  skip to the next
121e0 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22   "?", "=" or "&"
121f0 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
12200 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
12210 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
12220 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
12230 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  #' .            
12240 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20    && (eState!=0 
12250 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20  || c!='?').     
12260 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
12270 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d  ate!=1 || (c!='=
12280 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20  ' && c!='&')).  
12290 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
122a0 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d  eState!=2 || c!=
122b0 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29  '&').          )
122c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49  {.            iI
122d0 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
122e0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
122f0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
12300 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74         c = octet
12310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12320 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28  ( eState==1 && (
12330 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27  c=='&' || c=='='
12340 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
12350 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d   zFile[iOut-1]==
12360 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
12370 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f  * An empty optio
12380 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74  n name. Ignore t
12390 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67  his option altog
123a0 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ether. */.      
123b0 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
123c0 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
123d0 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69  ]!='#' && zUri[i
123e0 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e  In-1]!='&' ) iIn
123f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
12400 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12410 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
12420 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='&' ){.        
12430 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
12440 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
12450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12460 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20   eState = 2;.   
12470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
12480 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
12490 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30  e if( (eState==0
124a0 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28   && c=='?') || (
124b0 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d  eState==2 && c==
124c0 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '&') ){.        
124d0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  c = 0;.        e
124e0 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
124f0 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69   }.      zFile[i
12500 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
12510 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  }.    if( eState
12520 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74  ==1 ) zFile[iOut
12530 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
12540 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
12550 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
12560 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
12570 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
12580 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20   there were any 
12590 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65  options specifie
125a0 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
125b0 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20   interpreted .  
125c0 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f    ** here. Optio
125d0 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ns that are inte
125e0 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63  rpreted here inc
125f0 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74  lude "vfs" and t
12600 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  hose that.    **
12610 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66   correspond to f
12620 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65  lags that may be
12630 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
12640 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
12650 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20  .    ** method. 
12660 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  */.    zOpt = &z
12670 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  File[sqlite3Strl
12680 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a  en30(zFile)+1];.
12690 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b      while( zOpt[
126a0 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
126b0 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74  nOpt = sqlite3St
126c0 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20  rlen30(zOpt);.  
126d0 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d      char *zVal =
126e0 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a   &zOpt[nOpt+1];.
126f0 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d        int nVal =
12700 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
12710 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69  (zVal);..      i
12720 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65  f( nOpt==3 && me
12730 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74  mcmp("vfs", zOpt
12740 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
12750 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a     zVfs = zVal;.
12760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12770 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e       struct Open
12780 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20  Mode {.         
12790 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
127a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
127b0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61  de;.        } *a
127c0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
127d0 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70    char *zModeTyp
127e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
127f0 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
12800 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
12810 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   0;..        if(
12820 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63   nOpt==5 && memc
12830 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74  mp("cache", zOpt
12840 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 5)==0 ){.     
12850 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
12860 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63  ct OpenMode aCac
12870 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  heMode[] = {.   
12880 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72           { "shar
12890 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ed",  SQLITE_OPE
128a0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
128b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
128c0 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45  private", SQLITE
128d0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
128e0 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
128f0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
12900 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
12910 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
12920 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
12930 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  E|SQLITE_OPEN_PR
12940 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20  IVATECACHE;.    
12950 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43        aMode = aC
12960 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20  acheMode;.      
12970 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
12980 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
12990 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b  eType = "cache";
129a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
129b0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26     if( nOpt==4 &
129c0 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c  & memcmp("mode",
129d0 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a   zOpt, 4)==0 ){.
129e0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
129f0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
12a00 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b   aOpenMode[] = {
12a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
12a20 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ro",  SQLITE_OPE
12a30 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
12a40 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22            { "rw"
12a50 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
12a60 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20  EADWRITE }, .   
12a70 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22           { "rwc"
12a80 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
12a90 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
12aa0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d              { "m
12ac0 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f  emory", SQLITE_O
12ad0 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20  PEN_MEMORY },.  
12ae0 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
12af0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
12b00 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
12b10 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
12b20 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f  ADONLY | SQLITE_
12b30 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b50 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
12b60 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
12b70 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20  OPEN_MEMORY;.   
12b80 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
12b90 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20  OpenMode;.      
12ba0 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
12bb0 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   & flags;.      
12bc0 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
12bd0 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20  "access";.      
12be0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
12bf0 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   aMode ){.      
12c00 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
12c10 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20       int mode = 
12c20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
12c30 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a  (i=0; aMode[i].z
12c40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12c50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12c60 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a  z = aMode[i].z;.
12c70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12c80 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  nVal==sqlite3Str
12c90 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d  len30(z) && 0==m
12ca0 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e  emcmp(zVal, z, n
12cb0 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
12cc0 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f        mode = aMo
12cd0 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20  de[i].mode;.    
12ce0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
12d00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12d10 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30       if( mode==0
12d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12d30 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
12d40 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
12d50 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73  such %s mode: %s
12d60 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56  ", zModeType, zV
12d70 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
12d80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
12d90 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
12da0 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
12db0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
12dc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d            if( (m
12dd0 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ode & ~SQLITE_OP
12de0 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74  EN_MEMORY)>limit
12df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12e00 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
12e10 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
12e20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
12e30 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
12e60 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
12e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
12e80 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  = SQLITE_PERM;. 
12e90 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
12ea0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
12eb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12ec0 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c       flags = (fl
12ed0 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d  ags & ~mask) | m
12ee0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ode;.        }. 
12ef0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f       }..      zO
12f00 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b  pt = &zVal[nVal+
12f10 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  1];.    }..  }el
12f20 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  se{.    zFile = 
12f30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
12f40 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
12f50 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
12f60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12f70 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20    memcpy(zFile, 
12f80 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
12f90 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27   zFile[nUri] = '
12fa0 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  \0';.    zFile[n
12fb0 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Uri+1] = '\0';. 
12fc0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
12fd0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
12fe0 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71  }..  *ppVfs = sq
12ff0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
13000 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56  Vfs);.  if( *ppV
13010 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a  fs==0 ){.    *pz
13020 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
13030 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63  _mprintf("no suc
13040 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73  h vfs: %s", zVfs
13050 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
13060 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70  TE_ERROR;.  }. p
13070 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20  arse_uri_out:.  
13080 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13090 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
130a0 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  _free(zFile);.  
130b0 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d    zFile = 0;.  }
130c0 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61  .  *pFlags = fla
130d0 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20  gs;.  *pzFile = 
130e0 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  zFile;.  return 
130f0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
13100 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
13110 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e  the work of open
13120 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f  ing a database o
13130 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73  n behalf of.** s
13140 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e  qlite3_open() an
13150 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  d sqlite3_open16
13160 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  (). The database
13170 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65   filename "zFile
13180 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54  name"  .** is UT
13190 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a  F-8 encoded..*/.
131a0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
131b0 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74  atabase(.  const
131c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
131d0 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69  , /* Database fi
131e0 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63  lename UTF-8 enc
131f0 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  oded */.  sqlite
13200 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
13210 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65   /* OUT: Returne
13220 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
13230 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
13240 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a  int flags,    /*
13250 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61   Operational fla
13260 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
13270 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f  ar *zVfs       /
13280 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  * Name of the VF
13290 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  S to use */.){. 
132a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61   /* Store alloca
132d0 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ted handle here 
132e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13300 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
13310 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ode */.  int isT
13320 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20  hreadsafe;      
13330 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13340 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20   for threadsafe 
13350 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
13360 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30   char *zOpen = 0
13370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13380 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67   /* Filename arg
13390 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
133a0 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a   BtreeOpen() */.
133b0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
133c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
133d0 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
133e0 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50  ge from sqlite3P
133f0 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20  arseUri() */..  
13400 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
13410 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13420 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
13430 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
13440 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
13450 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
13460 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  f..  /* Only all
13470 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62  ow sensible comb
13480 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  inations of bits
13490 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72   in the flags ar
134a0 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54  gument.  .  ** T
134b0 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
134c0 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63   any non-sense c
134d0 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73  ombination is us
134e0 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ed.  If we.  ** 
134f0 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c  do not block ill
13500 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  egal combination
13510 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64  s here, it could
13520 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73   trigger.  ** as
13530 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
13540 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65  s in deeper laye
13550 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f  rs.  Sensible co
13560 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  mbinations.  ** 
13570 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  are:.  **.  **  
13580 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  1:  SQLITE_OPEN_
13590 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32  READONLY.  **  2
135a0 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
135b0 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36  EADWRITE.  **  6
135c0 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
135d0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
135e0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20  E_OPEN_CREATE.  
135f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
13600 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
13610 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20  Y  == 0x01 );.  
13620 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
13630 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d  PEN_READWRITE ==
13640 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72   0x02 );.  asser
13650 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  t( SQLITE_OPEN_C
13660 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34  REATE    == 0x04
13670 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
13680 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
13690 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f  0x02 ); /* READO
136a0 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  NLY */.  testcas
136b0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
136c0 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45  )==0x04 ); /* RE
136d0 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73  ADWRITE */.  tes
136e0 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
136f0 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f  s&7))==0x40 ); /
13700 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52  * READWRITE | CR
13710 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28  EATE */.  if( ((
13720 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20  1<<(flags&7)) & 
13730 30 78 34 36 29 3d 3d 30 20 29 20 72 65 74 75 72  0x46)==0 ) retur
13740 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
13750 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c  BKPT;..  if( sql
13760 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13770 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29  .bCoreMutex==0 )
13780 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
13790 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
137a0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
137b0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
137c0 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
137d0 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
137e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
137f0 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
13800 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
13810 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65  adsafe = 1;.  }e
13820 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61  lse{.    isThrea
13830 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47  dsafe = sqlite3G
13840 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
13850 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66  lMutex;.  }.  if
13860 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
13870 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
13880 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  HE ){.    flags 
13890 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
138a0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
138b0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
138c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
138d0 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
138e0 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
138f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
13900 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
13910 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75  /* Remove harmfu
13920 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  l bits from the 
13930 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
13940 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
13950 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
13960 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45  X and SQLITE_OPE
13970 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67  N_FULLMUTEX flag
13980 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c  s were.  ** deal
13990 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72  t with in the pr
139a0 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63  evious code bloc
139b0 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73  k.  Besides thes
139c0 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a  e, the only.  **
139d0 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61   valid input fla
139e0 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f  gs for sqlite3_o
139f0 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c  pen_v2() are SQL
13a00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
13a10 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  Y,.  ** SQLITE_O
13a20 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53  PEN_READWRITE, S
13a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13a40 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  E, SQLITE_OPEN_S
13a50 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a  HAREDCACHE,.  **
13a60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
13a70 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73  VATECACHE, and s
13a80 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74  ome reserved bit
13a90 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  s.  Silently mas
13aa0 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
13ab0 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
13ac0 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
13ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
13ae0 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
13af0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
13b00 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
13b10 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
13b20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
13b30 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
13b40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13b50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
13b70 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
13b80 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
13b90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13ba0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
13bb0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
13bc0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
13bd0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
13bf0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
13c00 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
13c10 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13c20 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
13c30 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
13c40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
13c50 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
13c60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13c70 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a  PEN_FULLMUTEX |.
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a              );..
13cb0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
13cc0 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74  e sqlite data st
13cd0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20  ructure */.  db 
13ce0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13cf0 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69  ero( sizeof(sqli
13d00 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62  te3) );.  if( db
13d10 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64  ==0 ) goto opend
13d20 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54  b_out;.  if( isT
13d30 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20  hreadsafe ){.   
13d40 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c   db->mutex = sql
13d50 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
13d60 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
13d70 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  RSIVE);.    if( 
13d80 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  db->mutex==0 ){.
13d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13da0 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62  ee(db);.      db
13db0 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
13dc0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
13dd0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13de0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
13df0 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
13e00 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20  rrMask = 0xff;. 
13e10 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
13e20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
13e30 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
13e40 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
13e50 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73  DbStatic;..  ass
13e60 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
13e70 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
13e80 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
13e90 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
13ea0 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
13eb0 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
13ec0 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  t));.  db->autoC
13ed0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
13ee0 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
13ef0 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  1;.  db->szMmap 
13f00 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
13f10 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
13f20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
13f30 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
13f40 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
13f50 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49  tColNames | SQLI
13f60 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
13f70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
13f80 4c 49 54 45 5f 44 45 41 55 4c 54 5f 41 55 54 4f  LITE_DEAULT_AUTO
13f90 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20  MATIC_INDEX) || 
13fa0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13fb0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
13fe0 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ex.#endif.#if SQ
13ff0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
14000 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
14010 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
14020 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
14030 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
14040 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
14050 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14070 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
14080 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
14090 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
140a0 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
140b0 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
140c0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
140d0 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
140e0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
140f0 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
14100 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
14110 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
14120 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
14130 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
14140 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#e
14150 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
14160 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
14170 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
14180 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14190 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
141a0 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
141b0 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
141c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
141d0 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
141e0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
141f0 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
14200 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
14210 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
14220 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
14230 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
14240 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
14250 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
14260 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
14270 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
14280 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
14290 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
142a0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ure..  */.  crea
142b0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
142c0 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
142d0 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
142e0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
142f0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
14300 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
14310 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
14320 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
14330 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
14340 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
14350 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
14360 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
14370 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
14380 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
14390 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
143a0 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
143b0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
143c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
143d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
143e0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
143f0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
14400 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
14410 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
14420 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b  8, "BINARY", 0);
14430 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
14440 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
14450 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20    /* Also add a 
14460 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e  UTF-8 case-insen
14470 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e  sitive collation
14480 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20   sequence. */.  
14490 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
144a0 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51  db, "NOCASE", SQ
144b0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f  LITE_UTF8, 0, no
144c0 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
144d0 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  c, 0);..  /* Par
144e0 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f  se the filename/
144f0 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  URI argument. */
14500 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
14510 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d   = flags;.  rc =
14520 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
14530 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
14540 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
14550 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
14560 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
14570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14580 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14590 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61  E_NOMEM ) db->ma
145a0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
145b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
145c0 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  (db, rc, zErrMsg
145d0 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72   ? "%s" : 0, zEr
145e0 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
145f0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
14600 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
14610 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
14620 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
14630 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
14640 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  r */.  rc = sqli
14650 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
14660 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62  >pVfs, zOpen, db
14670 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  , &db->aDb[0].pB
14680 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
146a0 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
146b0 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66  N_MAIN_DB);.  if
146c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
146d0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
146e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
146f0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
14700 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14710 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
14720 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
14730 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
14740 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
14750 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
14760 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
14770 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
14780 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
14790 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
147a0 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
147b0 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68  b, 0);...  /* Th
147c0 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
147d0 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
147e0 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
147f0 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20  'full'; for the 
14800 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
14810 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e  se it is 'NONE'.
14820 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
14830 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
14840 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
14850 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d   db->aDb[0].zNam
14860 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
14870 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
14880 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d  level = 3;.  db-
14890 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[1].zName = 
148a0 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44  "temp";.  db->aD
148b0 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[1].safety_leve
148c0 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61  l = 1;..  db->ma
148d0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
148e0 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
148f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14900 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
14910 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
14920 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
14930 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
14940 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
14950 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
14960 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
14970 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
14980 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
14990 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
149a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
149b0 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
149c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
149d0 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
149e0 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
149f0 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
14a00 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
14a10 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
14a20 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
14a30 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
14a40 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
14a50 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
14a60 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
14a70 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
14a80 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63  ) API..  */.  rc
14a90 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
14aa0 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  de(db);.  if( rc
14ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14ac0 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f     sqlite3AutoLo
14ad0 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  adExtensions(db)
14ae0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14af0 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
14b00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
14b20 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
14b30 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
14b40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14b50 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
14b60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14b70 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
14b80 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
14b90 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
14ba0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
14bb0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
14bc0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
14bd0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
14be0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
14bf0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
14c00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
14c10 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14c20 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
14c30 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
14c40 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
14c50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
14c60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14c70 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64  LE_FTS3.  if( !d
14c80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14c90 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
14ca0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14cb0 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
14cc0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
14cd0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14ce0 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
14cf0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
14d00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
14d10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14d20 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
14d30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
14d40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14d50 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
14d60 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
14d70 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
14d80 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14d90 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
14da0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
14db0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
14dc0 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44  rc, 0);..  /* -D
14dd0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
14de0 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61  OCKING_MODE=1 ma
14df0 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68  kes EXCLUSIVE th
14e00 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
14e10 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44  g.  ** mode.  -D
14e20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
14e30 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61  OCKING_MODE=0 ma
14e40 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  ke NORMAL the de
14e50 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
14e60 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20  ** mode.  Doing 
14e70 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61  nothing at all a
14e80 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c  lso makes NORMAL
14e90 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20   the default..  
14ea0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14eb0 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
14ec0 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74  _MODE.  db->dflt
14ed0 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54  LockMode = SQLIT
14ee0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
14ef0 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65  G_MODE;.  sqlite
14f00 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
14f10 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e(sqlite3BtreePa
14f20 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ger(db->aDb[0].p
14f30 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Bt),.           
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
14f50 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
14f60 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e  CKING_MODE);.#en
14f70 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65  dif..  /* Enable
14f80 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d   the lookaside-m
14f90 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
14fa0 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73  */.  setupLookas
14fb0 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74  ide(db, 0, sqlit
14fc0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
14fd0 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20  zLookaside,.    
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
15000 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
15010 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  de);..  sqlite3_
15020 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
15030 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45  nt(db, SQLITE_DE
15040 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48  FAULT_WAL_AUTOCH
15050 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e  ECKPOINT);..open
15060 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  db_out:.  sqlite
15070 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20  3_free(zOpen);. 
15080 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61   if( db ){.    a
15090 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78  ssert( db->mutex
150a0 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73  !=0 || isThreads
150b0 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  afe==0 || sqlite
150c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
150d0 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  ullMutex==0 );. 
150e0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
150f0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
15100 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
15110 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
15120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  );.  assert( db!
15130 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
15140 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20  _NOMEM );.  if( 
15150 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
15160 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15170 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64  close(db);.    d
15180 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  b = 0;.  }else i
15190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
151a0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
151b0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
151c0 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70  _SICK;.  }.  *pp
151d0 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20  Db = db;.#ifdef 
151e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
151f0 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74  LLOG.  if( sqlit
15200 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
15210 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a  Sqllog ){.    /*
15220 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61   Opening a db ha
15230 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
15240 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
15250 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20   0. */.    void 
15260 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47  *pArg = sqlite3G
15270 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
15280 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69  logArg;.    sqli
15290 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
152a0 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62  xSqllog(pArg, db
152b0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  , zFilename, 0);
152c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
152d0 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45  turn sqlite3ApiE
152e0 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  xit(0, rc);.}../
152f0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
15300 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
15310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
15320 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
15330 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  ar *zFilename, .
15340 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
15350 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70   .){.  return op
15360 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
15370 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20  name, ppDb,.    
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15390 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
153a0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
153b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
153c0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
153d0 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74  open_v2(.  const
153e0 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
153f0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
15400 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20  ilename (UTF-8) 
15410 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
15420 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pDb,         /* 
15430 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68  OUT: SQLite db h
15440 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  andle */.  int f
15450 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
15460 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20     /* Flags */. 
15470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
15480 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  s        /* Name
15490 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74   of VFS module t
154a0 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  o use */.){.  re
154b0 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
154c0 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  e(filename, ppDb
154d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
154e0 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a  flags, zVfs);.}.
154f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15500 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
15510 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
15520 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
15530 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
15540 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  16(.  const void
15550 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
15560 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29  sqlite3 **ppDb.)
15570 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
15580 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a  zFilename8;   /*
15590 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64   zFilename encod
155a0 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74  ed in UTF-8 inst
155b0 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f  ead of UTF-16 */
155c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
155d0 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63   *pVal;.  int rc
155e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  ;..  assert( zFi
155f0 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  lename );.  asse
15600 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70  rt( ppDb );.  *p
15610 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
15620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15630 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
15640 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
15650 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
15660 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
15670 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
15680 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
15690 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
156a0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c  r(pVal, -1, zFil
156b0 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54  ename, SQLITE_UT
156c0 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54  F16NATIVE, SQLIT
156d0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69  E_STATIC);.  zFi
156e0 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65  lename8 = sqlite
156f0 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
15700 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
15710 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20   if( zFilename8 
15720 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
15730 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
15740 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  me8, ppDb,.     
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15770 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
15780 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
15790 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
157a0 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  Db || rc==SQLITE
157b0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
157c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
157d0 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  && !DbHasPropert
157e0 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53  y(*ppDb, 0, DB_S
157f0 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a  chemaLoaded) ){.
15800 20 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29        ENC(*ppDb)
15810 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
15820 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  ATIVE;.    }.  }
15830 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
15840 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
15850 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
15860 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
15870 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45  turn sqlite3ApiE
15880 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65  xit(0, rc);.}.#e
15890 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
158a0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
158b0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
158c0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
158d0 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
158e0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
158f0 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
15900 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
15910 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
15920 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
15930 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
15940 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
15950 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
15960 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
15970 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
15980 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
15990 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
159a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
159b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
159c0 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
159d0 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
159e0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
159f0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
15a00 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
15a10 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20  are, 0);.  rc = 
15a20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
15a30 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
15a40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
15a50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
15a60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15a70 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
15a80 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
15a90 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
15aa0 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
15ab0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
15ac0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
15ad0 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  2(.  sqlite3* db
15ae0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
15af0 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
15b00 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
15b10 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
15b20 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
15b30 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
15b40 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
15b50 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
15b60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
15b70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15b80 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
15b90 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
15ba0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
15bb0 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
15bc0 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
15bd0 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
15be0 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
15bf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
15c00 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
15c10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15c20 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
15c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15c40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15c50 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
15c60 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
15c70 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
15c80 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
15c90 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
15ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
15cb0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
15cc0 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
15cd0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  b, .  const void
15ce0 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65   *zName,.  int e
15cf0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
15d00 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
15d10 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
15d20 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
15d30 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
15d40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15d50 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  OK;.  char *zNam
15d60 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e8;.  sqlite3_mu
15d70 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
15d80 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
15d90 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
15da0 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  d );.  zName8 = 
15db0 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
15dc0 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
15dd0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
15de0 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  E);.  if( zName8
15df0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
15e00 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
15e10 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
15e20 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
15e30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15e40 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
15e50 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e8);.  }.  rc = 
15e60 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
15e70 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
15e80 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
15e90 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
15ea0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
15eb0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
15ec0 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
15ed0 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
15ee0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
15ef0 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
15f00 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
15f10 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
15f20 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
15f30 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
15f40 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
15f50 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
15f60 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
15f70 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71  ion_needed(.  sq
15f80 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
15f90 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
15fa0 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
15fb0 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c  llNeeded)(void*,
15fc0 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
15fd0 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72  xtRep,const char
15fe0 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
15ff0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
16000 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
16010 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c  ollNeeded = xCol
16020 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78  lNeeded;.  db->x
16030 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30  CollNeeded16 = 0
16040 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
16050 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
16060 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
16070 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
16080 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
16090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
160a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
160b0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
160c0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
160d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
160e0 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
160f0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
16100 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
16110 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
16120 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
16130 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
16140 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
16150 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
16160 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
16170 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
16180 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
16190 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
161a0 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29  (*xCollNeeded16)
161b0 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
161c0 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
161d0 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73  st void*).){.  s
161e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
161f0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
16200 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
16210 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c   = 0;.  db->xCol
16220 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c  lNeeded16 = xCol
16230 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d  lNeeded16;.  db-
16240 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
16250 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
16260 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
16270 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
16280 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
16290 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
162a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
162b0 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
162c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
162d0 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
162e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
162f0 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69  now an anachroni
16300 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  sm. It used to b
16310 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65  e used to recove
16320 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c  r from a.** mall
16330 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75  oc() failure, bu
16340 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65  t SQLite now doe
16350 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63  s this automatic
16360 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
16370 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
16380 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ver(void){.  ret
16390 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
163a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
163b0 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
163c0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61  er or not the da
163d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
163e0 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  n is in autocomm
163f0 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74  it.** mode.  Ret
16400 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
16410 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  s and FALSE if n
16420 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  ot.  Autocommit 
16430 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79  mode is on.** by
16440 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63   default.  Autoc
16450 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65  ommit is disable
16460 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61  d by a BEGIN sta
16470 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61  tement and reena
16480 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e  bled.** by the n
16490 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  ext COMMIT or RO
164a0 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  LLBACK..*/.int s
164b0 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
164c0 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
164d0 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
164e0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a  >autoCommit;.}..
164f0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
16500 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
16510 20 73 75 62 74 69 74 75 74 65 73 20 66 6f 72 20   subtitutes for 
16520 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45  constants SQLITE
16530 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c  _CORRUPT,.** SQL
16540 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49  ITE_MISUSE, SQLI
16550 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c  TE_CANTOPEN, SQL
16560 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f  ITE_IOERR and po
16570 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72  ssibly other err
16580 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  or.** constants.
16590 20 20 54 68 65 79 20 73 65 72 76 65 72 20 74 77    They server tw
165a0 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a  o purposes:.**.*
165b0 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73  *   1.  Serve as
165c0 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
165d0 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
165e0 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62  akpoint in a deb
165f0 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74  ugger.**       t
16600 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65  o detect when ve
16610 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64  rsion error cond
16620 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a  itions occurs..*
16630 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b  *.**   2.  Invok
16640 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
16650 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73  to provide the s
16660 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74  ource code locat
16670 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20  ion where.**    
16680 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65     a low-level e
16690 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65  rror is first de
166a0 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  tected..*/.int s
166b0 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72  qlite3CorruptErr
166c0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
166d0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
166e0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
166f0 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
16700 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
16710 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20  CORRUPT,.       
16720 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65         "database
16730 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c   corruption at l
16740 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
16750 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
16760 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
16770 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
16780 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16790 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74  E_CORRUPT;.}.int
167a0 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
167b0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
167c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
167d0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
167e0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
167f0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
16800 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20  _MISUSE, .      
16810 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65 20          "misuse 
16820 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
16830 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
16840 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
16850 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
16860 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
16870 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a  QLITE_MISUSE;.}.
16880 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
16890 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
168a0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
168b0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
168c0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
168d0 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
168e0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
168f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
16900 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
16910 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
16920 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
16930 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
16940 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
16950 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
16960 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
16970 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
16980 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
16990 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  TED./*.** This i
169a0 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  s a convenience 
169b0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b  routine that mak
169c0 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  es sure that all
169d0 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
169e0 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69  .** data for thi
169f0 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65  s thread has bee
16a00 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  n deallocated..*
16a10 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c  *.** SQLite no l
16a20 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61  onger uses threa
16a30 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
16a40 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
16a50 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f  is now a.** no-o
16a60 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e  p.  It is retain
16a70 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  ed for historica
16a80 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
16a90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16aa0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
16ab0 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a  void){.}.#endif.
16ac0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65  ./*.** Return me
16ad0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ta information a
16ae0 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20  bout a specific 
16af0 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61  column of a data
16b00 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53  base table..** S
16b10 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71  ee comment in sq
16b20 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e  lite3.h (sqlite.
16b30 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c  h.in) for detail
16b40 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
16b50 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
16b60 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73  N_METADATA.int s
16b70 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
16b80 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
16b90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16bb0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
16bc0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
16bd0 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20   *zDbName,      
16be0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
16bf0 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  me or NULL */.  
16c00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
16c10 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54  leName,     /* T
16c20 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  able name */.  c
16c30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
16c40 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f  mnName,    /* Co
16c50 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  lumn name */.  c
16c60 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61  har const **pzDa
16c70 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55  taType,    /* OU
16c80 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64  TPUT: Declared d
16c90 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  ata type */.  ch
16ca0 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c  ar const **pzCol
16cb0 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54  lSeq,     /* OUT
16cc0 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73  PUT: Collation s
16cd0 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
16ce0 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c    int *pNotNull,
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d00 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
16d10 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
16d20 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  aint exists */. 
16d30 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65   int *pPrimaryKe
16d40 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
16d50 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
16d60 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50  column part of P
16d70 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74  K */.  int *pAut
16d80 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  oinc            
16d90 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
16da0 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
16db0 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a  auto-increment *
16dc0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
16dd0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
16de0 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   0;.  Table *pTa
16df0 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  b = 0;.  Column 
16e00 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
16e10 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63   iCol;..  char c
16e20 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20  onst *zDataType 
16e30 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
16e40 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b  t *zCollSeq = 0;
16e50 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d  .  int notnull =
16e60 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72   0;.  int primar
16e70 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ykey = 0;.  int 
16e80 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20  autoinc = 0;..  
16e90 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61  /* Ensure the da
16ea0 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
16eb0 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f  s been loaded */
16ec0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16ed0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
16ee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16ef0 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
16f00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69   rc = sqlite3Ini
16f10 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b  t(db, &zErrMsg);
16f20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
16f30 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !=rc ){.    goto
16f40 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
16f50 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
16f60 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
16f70 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  on */.  pTab = s
16f80 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
16f90 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  db, zTableName, 
16fa0 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
16fb0 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70  !pTab || pTab->p
16fc0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54  Select ){.    pT
16fd0 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  ab = 0;.    goto
16fe0 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
16ff0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63  .  /* Find the c
17000 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20  olumn for which 
17010 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65  info is requeste
17020 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  d */.  if( sqlit
17030 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
17040 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43  nName) ){.    iC
17050 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
17060 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
17070 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  0 ){.      pCol 
17080 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
17090 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ol];.    }.  }el
170a0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
170b0 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
170c0 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
170d0 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
170e0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
170f0 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
17100 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
17110 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
17120 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
17130 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17140 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
17150 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
17160 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
17170 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
17180 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
17190 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
171a0 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
171b0 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
171c0 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
171d0 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
171e0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
171f0 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
17200 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
17210 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
17220 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
17230 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
17240 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
17250 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
17260 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
17270 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
17280 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
17290 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
172a0 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
172b0 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
172c0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
172d0 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
172e0 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
172f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
17300 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
17310 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
17320 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
17330 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
17340 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
17350 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
17360 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
17370 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
17380 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
17390 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
173a0 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d  DataType = pCol-
173b0 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c  >zType;.    zCol
173c0 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
173d0 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
173e0 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21  = pCol->notNull!
173f0 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  =0;.    primaryk
17400 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c  ey  = (pCol->col
17410 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
17420 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20  PRIMKEY)!=0;.   
17430 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d   autoinc = pTab-
17440 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20  >iPKey==iCol && 
17450 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
17460 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
17470 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  nt)!=0;.  }else{
17480 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
17490 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
174a0 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a  primarykey = 1;.
174b0 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c    }.  if( !zColl
174c0 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c  Seq ){.    zColl
174d0 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  Seq = "BINARY";.
174e0 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a    }..error_out:.
174f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17500 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
17510 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75  * Whether the fu
17520 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63  nction call succ
17530 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c  eeded or failed,
17540 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
17550 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20  parameters.  ** 
17560 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69  to whatever thei
17570 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70  r local counterp
17580 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66  arts contain. If
17590 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63   an error did oc
175a0 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68  cur,.  ** this h
175b0 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
175c0 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74   zeroing all out
175d0 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  put parameters..
175e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74    */.  if( pzDat
175f0 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54  aType ) *pzDataT
17600 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b  ype = zDataType;
17610 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71  .  if( pzCollSeq
17620 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20   ) *pzCollSeq = 
17630 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20  zCollSeq;.  if( 
17640 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74  pNotNull ) *pNot
17650 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a  Null = notnull;.
17660 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65    if( pPrimaryKe
17670 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  y ) *pPrimaryKey
17680 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20   = primarykey;. 
17690 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20   if( pAutoinc ) 
176a0 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f  *pAutoinc = auto
176b0 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  inc;..  if( SQLI
176c0 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54  TE_OK==rc && !pT
176d0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
176e0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
176f0 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73  Msg);.    zErrMs
17700 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
17710 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20  tf(db, "no such 
17720 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73  table column: %s
17730 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  .%s", zTableName
17740 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d  ,.        zColum
17750 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  nName);.    rc =
17760 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17770 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
17780 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d  r(db, rc, (zErrM
17790 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72  sg?"%s":0), zErr
177a0 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
177b0 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
177c0 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  g);.  rc = sqlit
177d0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
177e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
177f0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
17800 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
17810 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17820 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
17830 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
17840 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
17850 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
17860 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65  .int sqlite3_sle
17870 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71  ep(int ms){.  sq
17880 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
17890 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66  .  int rc;.  pVf
178a0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
178b0 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70  find(0);.  if( p
178c0 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Vfs==0 ) return 
178d0 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  0;..  /* This fu
178e0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20  nction works in 
178f0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75  milliseconds, bu
17900 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  t the underlying
17910 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a   OsSleep() .  **
17920 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73   API uses micros
17930 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68  econds. Hence th
17940 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20  e 1000's..  */. 
17950 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73   rc = (sqlite3Os
17960 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30  Sleep(pVfs, 1000
17970 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65  *ms)/1000);.  re
17980 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17990 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
179a0 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64  ble the extended
179b0 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a   result codes..*
179c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  /.int sqlite3_ex
179d0 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
179e0 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  des(sqlite3 *db,
179f0 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73   int onoff){.  s
17a00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17a10 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
17a20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f   db->errMask = o
17a30 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66  noff ? 0xfffffff
17a40 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69  f : 0xff;.  sqli
17a50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
17a60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
17a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17a80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
17a90 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
17aa0 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72   method on a par
17ab0 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
17ac0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17ad0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71  _file_control(sq
17ae0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
17af0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
17b00 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
17b10 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rg){.  int rc = 
17b20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17b30 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a  Btree *pBtree;..
17b40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17b50 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
17b60 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c  ;.  pBtree = sql
17b70 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
17b80 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
17b90 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
17ba0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
17bb0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  r;.    sqlite3_f
17bc0 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c  ile *fd;.    sql
17bd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17be0 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67  Btree);.    pPag
17bf0 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
17c00 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a  ePager(pBtree);.
17c10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17c20 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20  er!=0 );.    fd 
17c30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
17c40 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  le(pPager);.    
17c50 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b  assert( fd!=0 );
17c60 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c  .    if( op==SQL
17c70 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
17c80 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
17c90 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a  *(sqlite3_file**
17ca0 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20  )pArg = fd;.    
17cb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17cc0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
17cd0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
17ce0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17cf0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
17d00 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  fd, op, pArg);. 
17d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17d20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
17d30 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OUND;.    }.    
17d40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17d50 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
17d60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17d70 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
17d80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
17d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .}../*.** Interf
17da0 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69  ace to the testi
17db0 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74  ng logic..*/.int
17dc0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
17dd0 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e  ntrol(int op, ..
17de0 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
17df0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17e00 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
17e10 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ST.  va_list ap;
17e20 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
17e30 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
17e40 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  p ){..    /*.   
17e50 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72   ** Save the cur
17e60 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
17e70 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20  e PRNG..    */. 
17e80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
17e90 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56  ESTCTRL_PRNG_SAV
17ea0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
17eb0 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28  e3PrngSaveState(
17ec0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17ed0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
17ee0 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65    ** Restore the
17ef0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
17f00 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73  NG to the last s
17f10 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67  tate saved using
17f20 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56  .    ** PRNG_SAV
17f30 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45  E.  If PRNG_SAVE
17f40 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
17f50 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  e been called, t
17f60 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  hen.    ** this 
17f70 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50  verb acts like P
17f80 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a  RNG_RESET..    *
17f90 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
17fa0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
17fb0 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20  RESTORE: {.     
17fc0 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74   sqlite3PrngRest
17fd0 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  oreState();.    
17fe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
17ff0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
18000 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63  set the PRNG bac
18010 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69  k to its uniniti
18020 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54  alized state.  T
18030 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20  he next call.   
18040 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72   ** to sqlite3_r
18050 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c  andomness() will
18060 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47   reseed the PRNG
18070 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
18080 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74  call.    ** to t
18090 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d  he xRandomness m
180a0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66  ethod of the def
180b0 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f  ault VFS..    */
180c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
180d0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
180e0 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  ESET: {.      sq
180f0 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74 53 74  lite3PrngResetSt
18100 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
18110 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18120 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
18130 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
18140 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65  ITVEC_TEST, size
18150 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a  , program).    *
18160 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74  *.    ** Run a t
18170 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69  est against a Bi
18180 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73  tvec object of s
18190 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61  ize.  The progra
181a0 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a  m argument.    *
181b0 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
181c0 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64   integers that d
181d0 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e  efines the test.
181e0 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61    Return -1 on a
181f0 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61  .    ** memory a
18200 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c  llocation error,
18210 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f   0 on success, o
18220 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61  r non-zero for a
18230 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20  n error..    ** 
18240 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42  See the sqlite3B
18250 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
18260 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
18270 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
18280 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
18290 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
182a0 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20  ITVEC_TEST: {.  
182b0 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
182c0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
182d0 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d      int *aProg =
182e0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
182f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
18300 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
18310 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67  inTest(sz, aProg
18320 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18330 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
18340 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
18350 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47  st_control(BENIG
18360 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20  N_MALLOC_HOOKS, 
18370 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20  xBegin, xEnd).  
18380 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69    **.    ** Regi
18390 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61  ster hooks to ca
183a0 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ll to indicate w
183b0 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61  hich malloc() fa
183c0 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61  ilures .    ** a
183d0 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a  re benign..    *
183e0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
183f0 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47  E_TESTCTRL_BENIG
18400 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20  N_MALLOC_HOOKS: 
18410 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  {.      typedef 
18420 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63  void (*void_func
18430 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20  tion)(void);.   
18440 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
18450 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20   xBenignBegin;. 
18460 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
18470 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20  on xBenignEnd;. 
18480 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69       xBenignBegi
18490 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  n = va_arg(ap, v
184a0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
184b0 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20       xBenignEnd 
184c0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
184d0 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
184e0 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e     sqlite3Benign
184f0 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e  MallocHooks(xBen
18500 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67  ignBegin, xBenig
18510 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65  nEnd);.      bre
18520 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18530 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
18540 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
18550 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
18560 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73  ENDING_BYTE, uns
18570 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20  igned int X).   
18580 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
18590 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
185a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
185b0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  the argument, if
185c0 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b   X>0..    ** Mak
185d0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
185e0 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68  X==0.  Return th
185f0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70  e value of the p
18600 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20  ending byte.    
18610 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e  ** as it existin
18620 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  g before this ro
18630 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
18640 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
18650 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e  IMPORTANT:  Chan
18660 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
18670 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30   byte from 0x400
18680 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e  00000 results in
18690 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d  .    ** an incom
186a0 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65  patible database
186b0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43   file format.  C
186c0 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
186d0 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ING byte.    ** 
186e0 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61  while any databa
186f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
18700 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e   open results in
18710 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20   undefined and. 
18720 20 20 20 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75     ** dileteriou
18730 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  s behavior..    
18740 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
18750 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
18760 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20  ING_BYTE: {.    
18770 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42    rc = PENDING_B
18780 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  YTE;.#ifndef SQL
18790 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20  ITE_OMIT_WSD.   
187a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73     {.        uns
187b0 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
187c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
187d0 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
187e0 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20       if( newVal 
187f0 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67  ) sqlite3Pending
18800 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20  Byte = newVal;. 
18810 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
18820 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18830 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
18840 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
18850 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
18860 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e  TCTRL_ASSERT, in
18870 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
18880 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
18890 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
188a0 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77  me test to see w
188b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
188c0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61    ** assert() wa
188d0 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
188e0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58  pile-time.  If X
188f0 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73   is true and ass
18900 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  ert().    ** is 
18910 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
18920 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
18930 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73  s true.  If X is
18940 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a   true and.    **
18950 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
18960 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
18970 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
18980 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20  zero.  If X is. 
18990 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20     ** false and 
189a0 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
189b0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73  led, then the as
189c0 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e  sertion fires an
189d0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  d the.    ** pro
189e0 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66  cess aborts.  If
189f0 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20   X is false and 
18a00 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
18a10 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  bled, then the. 
18a20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c     ** return val
18a30 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20  ue is zero..    
18a40 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
18a50 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
18a60 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61  RT: {.      vola
18a70 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a  tile int x = 0;.
18a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 78        assert( (x
18a90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
18aa0 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
18ab0 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65  c = x;.      bre
18ac0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
18ad0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
18ae0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
18af0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
18b00 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20  ALWAYS, int X). 
18b10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
18b20 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
18b30 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
18b40 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65  t to see how the
18b50 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20   ALWAYS and.    
18b60 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20  ** NEVER macros 
18b70 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20  were defined at 
18b80 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20  compile-time..  
18b90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
18ba0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
18bb0 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20  ALWAYS(X).  .   
18bc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
18bd0 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20  ecommended test 
18be0 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65  is X==2.  If the
18bf0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
18c00 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20   2, that means. 
18c10 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61     ** ALWAYS() a
18c20 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62  nd NEVER() are b
18c30 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  oth no-op pass-t
18c40 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77  hrough macros, w
18c50 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20  hich is the.    
18c60 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  ** default setti
18c70 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  ng.  If the retu
18c80 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74  rn value is 1, t
18c90 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20  hen ALWAYS() is 
18ca0 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61  either.    ** ha
18cb0 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
18cc0 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65   or else it asse
18cd0 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d  rts if its argum
18ce0 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  ent is false..  
18cf0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62    ** The first b
18d00 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f  ehavior (hard-co
18d10 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20  ded to true) is 
18d20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
18d30 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
18d40 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
18d50 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
18d60 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68   disabled and th
18d70 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
18d80 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74  behavior (assert
18d90 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
18da0 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20   to ALWAYS() is 
18db0 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61  false) is the ca
18dc0 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
18dd0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
18de0 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
18df0 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
18e00 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
18e10 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74  * The run-time t
18e20 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69  est procedure mi
18e30 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69  ght look somethi
18e40 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ng like this:.  
18e50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69    **.    **    i
18e60 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
18e70 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
18e80 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
18e90 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20  2)==2 ){.    ** 
18ea0 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29       // ALWAYS()
18eb0 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
18ec0 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
18ed0 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a  ugh macros.    *
18ee0 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  *    }else if( s
18ef0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
18f00 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
18f10 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29  TRL_ASSERT, 1) )
18f20 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
18f30 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72   ALWAYS(x) asser
18f40 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75  ts that x is tru
18f50 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65  e. NEVER(x) asse
18f60 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a  rts x is false..
18f70 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b      **    }else{
18f80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
18f90 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63  ALWAYS(x) is a c
18fa0 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45  onstant 1.  NEVE
18fb0 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61  R(x) is a consta
18fc0 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20  nt 0..    **    
18fd0 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  }.    */.    cas
18fe0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
18ff0 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20  L_ALWAYS: {.    
19000 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
19010 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
19020 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a  rc = ALWAYS(x);.
19030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19040 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
19050 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
19060 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
19070 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74  L_RESERVE, sqlit
19080 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
19090 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
190a0 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69   the nReserve si
190b0 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20  ze to N for the 
190c0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
190d0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
190e0 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
190f0 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  db..    */.    c
19100 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19110 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20  TRL_RESERVE: {. 
19120 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
19130 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
19140 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69  lite3*);.      i
19150 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
19160 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ,int);.      sql
19170 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19180 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
19190 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
191a0 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61  etPageSize(db->a
191b0 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c  Db[0].pBt, 0, x,
191c0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
191d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
191e0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
191f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
19200 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
19210 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
19220 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
19230 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74  MIZATIONS, sqlit
19240 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20  e3 *db, int N). 
19250 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61     **.    ** Ena
19260 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76  ble or disable v
19270 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
19280 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ions for testing
19290 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20   purposes.  The 
192a0 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74  .    ** argument
192b0 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20   N is a bitmask 
192c0 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  of optimizations
192d0 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e   to be disabled.
192e0 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20    For normal.   
192f0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20   ** operation N 
19300 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68  should be 0.  Th
19310 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61  e idea is that a
19320 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c   test program (l
19330 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  ike the.    ** S
19340 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72  QL Logic Test or
19350 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65   SLT test module
19360 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61  ) can run the sa
19370 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20  me SQL multiple 
19380 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  times.    ** wit
19390 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  h various optimi
193a0 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64  zations disabled
193b0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
193c0 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
193d0 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e      ** is obtain
193e0 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65  ed in every case
193f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
19400 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
19410 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a  L_OPTIMIZATIONS:
19420 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19430 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
19440 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
19450 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67     db->dbOptFlag
19460 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67  s = (u16)(va_arg
19470 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66  (ap, int) & 0xff
19480 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ff);.      break
19490 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
194a0 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
194b0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
194c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
194d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
194e0 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68  EYWORD, const ch
194f0 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a  ar *zWord).    *
19500 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72  *.    ** If zWor
19510 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72  d is a keyword r
19520 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65  ecognized by the
19530 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65   parser, then re
19540 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  turn the.    ** 
19550 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72  number of keywor
19560 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64  ds.  Or if zWord
19570 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72   is not a keywor
19580 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20  d, return 0..   
19590 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73   ** .    ** This
195a0 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69 73   test feature is
195b0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
195c0 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  in the amalgamat
195d0 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a  ion since.    **
195e0 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45   the SQLITE_N_KE
195f0 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e  YWORD macro is n
19600 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ot defined in th
19610 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74  is file if SQLit
19620 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c  e.    ** is buil
19630 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  t using separate
19640 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20   source files.. 
19650 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19660 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
19670 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20  SKEYWORD: {.    
19680 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
19690 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ord = va_arg(ap,
196a0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20   const char*);. 
196b0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
196c0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f  ite3Strlen30(zWo
196d0 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rd);.      rc = 
196e0 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43  (sqlite3KeywordC
196f0 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20  ode((u8*)zWord, 
19700 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c  n)!=TK_ID) ? SQL
19710 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20  ITE_N_KEYWORD : 
19720 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
19730 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20      }.#endif .. 
19740 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
19750 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
19760 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
19770 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70  CHMALLOC, sz, &p
19780 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  New, pFree);.   
19790 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20   **.    ** Pass 
197a0 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74  pFree into sqlit
197b0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e  e3ScratchFree().
197c0 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30   .    ** If sz>0
197d0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
197e0 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20   scratch buffer 
197f0 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20  into pNew.  .   
19800 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19810 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
19820 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ATCHMALLOC: {.  
19830 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c      void *pFree,
19840 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20   **ppNew;.      
19850 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a  int sz;.      sz
19860 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
19870 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20  t);.      ppNew 
19880 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
19890 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65  d**);.      pFre
198a0 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
198b0 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28  oid*);.      if(
198c0 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73   sz ) *ppNew = s
198d0 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
198e0 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73  loc(sz);.      s
198f0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
19900 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
19910 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19920 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
19930 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
19940 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
19950 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74  LTIME_FAULT, int
19960 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
19970 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
19980 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
19990 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65  -zero, configure
199a0 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f   the wrappers so
199b0 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a   that all.    **
199c0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
199d0 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29  s to localtime()
199e0 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61   and variants fa
199f0 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
19a00 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64  zero,.    ** und
19a10 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
19a20 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19a30 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19a40 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
19a50 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19a60 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
19a70 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
19a80 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
19a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19aa0 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
19ab0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
19ac0 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 20 20  EE_EXPLAIN).    
19ad0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
19ae0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
19af0 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41 49  _TESTCTRL_EXPLAI
19b00 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a 2a 20 20  N_STMT,.    **  
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
19b30 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a  mt*,const char**
19b40 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
19b50 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
19b60 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  h SQLITE_ENABLE_
19b70 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c 20 65 61  TREE_EXPLAIN, ea
19b80 63 68 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ch sqlite3_stmt 
19b90 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20 61 20 73  holds.    ** a s
19ba0 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
19bb0 69 62 65 73 20 74 68 65 20 6f 70 74 69 6d 69 7a  ibes the optimiz
19bc0 65 64 20 70 61 72 73 65 20 74 72 65 65 2e 20 20  ed parse tree.  
19bd0 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f  This test-contro
19be0 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 73  l.    ** returns
19bf0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
19c00 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a  at string..    *
19c10 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
19c20 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41  E_TESTCTRL_EXPLA
19c30 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20  IN_STMT: {.     
19c40 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19c50 53 74 6d 74 20 3d 20 76 61 5f 61 72 67 28 61 70  Stmt = va_arg(ap
19c60 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29  , sqlite3_stmt*)
19c70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
19c80 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20 76 61 5f  ar **pzRet = va_
19c90 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
19ca0 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20 2a 70 7a  ar**);.      *pz
19cb0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Ret = sqlite3Vdb
19cc0 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 28 56 64  eExplanation((Vd
19cd0 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20 20 20  be*)pStmt);.    
19ce0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19cf0 65 6e 64 69 66 0a 0a 20 20 7d 0a 20 20 76 61 5f  endif..  }.  va_
19d00 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20  end(ap);.#endif 
19d10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
19d20 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20  UILTIN_TEST */. 
19d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19d40 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
19d50 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20  tility routine, 
19d60 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d  useful to VFS im
19d70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74  plementations, t
19d80 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f  hat checks.** to
19d90 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61   see if a databa
19da0 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52  se file was a UR
19db0 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64  I that contained
19dc0 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72   a specific quer
19dd0 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c  y .** parameter,
19de0 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69   and if so obtai
19df0 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
19e00 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  the query parame
19e10 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  ter..**.** The z
19e20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
19e30 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d  t is the filenam
19e40 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  e pointer passed
19e50 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28   into the xOpen(
19e60 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61  ).** method of a
19e70 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
19e80 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d  ion.  The zParam
19e90 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
19ea0 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
19eb0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
19ec0 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72  we seek.  This r
19ed0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
19ee0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
19ef0 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65  zParam.** parame
19f00 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73  ter if it exists
19f10 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
19f20 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ter does not exi
19f30 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
19f40 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55  .** returns a NU
19f50 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
19f60 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
19f70 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
19f80 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
19f90 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
19fa0 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69  ar *zParam){.  i
19fb0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
19fc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
19fd0 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
19fe0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
19ff0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
1a000 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
1a010 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
1a020 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
1a030 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
1a040 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1a050 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1a060 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
1a070 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
1a080 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
1a090 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1a0a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1a0b0 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1a0c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1a0d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1a0e0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
1a0f0 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1a100 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1a110 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1a120 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1a130 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1a140 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
1a150 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
1a160 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1a170 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1a180 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1a190 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
1a1a0 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
1a1b0 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
1a1c0 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
1a1d0 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
1a1e0 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
1a1f0 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
1a200 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1a210 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
1a220 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
1a230 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
1a240 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1a250 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
1a260 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
1a270 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
1a280 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
1a290 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
1a2a0 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
1a2b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1a2c0 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
1a2d0 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
1a2e0 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
1a2f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1a300 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1a310 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1a320 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1a330 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1a340 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
1a350 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26  lite3Atoi64(z, &
1a360 76 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  v, sqlite3Strlen
1a370 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
1a380 46 38 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  F8)==SQLITE_OK )
1a390 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b  {.    bDflt = v;
1a3a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44  .  }.  return bD
1a3b0 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
1a3c0 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20 70  turn the Btree p
1a3d0 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65  ointer identifie
1a3e0 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52  d by zDbName.  R
1a3f0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1a400 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65  t found..*/.Btre
1a410 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65  e *sqlite3DbName
1a420 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33 20  ToBtree(sqlite3 
1a430 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1a440 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  *zDbName){.  int
1a450 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1a460 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1a470 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
1a480 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26 20 28  i].pBt.     && (
1a490 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  zDbName==0 || sq
1a4a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
1a4b0 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d  Name, db->aDb[i]
1a4c0 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20  .zName)==0).    
1a4d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a4e0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
1a4f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a500 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
1a510 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61  eturn the filena
1a520 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1a530 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
1a540 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  th a database.**
1a550 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1a560 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1a570 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
1a580 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1a590 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1a5a0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  ){.  Btree *pBt 
1a5b0 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1a5c0 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1a5d0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
1a5e0 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
1a5f0 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29  GetFilename(pBt)
1a600 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
1a610 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61 62  eturn 1 if datab
1a620 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ase is read-only
1a630 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77 72   or 0 if read/wr
1a640 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ite.  Return -1 
1a650 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61  if.** no such da
1a660 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a  tabase exists..*
1a670 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
1a680 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65  _readonly(sqlite
1a690 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1a6a0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1a6b0 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69  tree *pBt = sqli
1a6c0 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1a6d0 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1a6e0 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1a6f0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
1a700 6f 6e 6c 79 28 73 71 6c 69 74 65 33 42 74 72 65  only(sqlite3Btre
1a710 65 50 61 67 65 72 28 70 42 74 29 29 20 3a 20 2d  ePager(pBt)) : -
1a720 31 3b 0a 7d 0a                                   1;.}.