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

Artifact a1f4bb79e15c3f0a2e4efb2f52781ccbfb3010d4:


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 0a  erredCons = 0;..
7fd0: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20    /* If one has 
7fe0: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
7ff0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c   invoke the roll
8000: 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61  back-hook callba
8010: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ck */.  if( db->
8020: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
8030: 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c  k && (inTrans ||
8040: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
8050: 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f  ) ){.    db->xRo
8060: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64  llbackCallback(d
8070: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29  b->pRollbackArg)
8080: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8090: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
80a0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
80b0: 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73   the name corres
80c0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65  ponding to the e
80d0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65  rror code.** spe
80e0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72  cified in the ar
80f0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64  gument..*/.#if d
8100: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
8110: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
8120: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
8130: 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53 51  \.    defined(SQ
8140: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
8150: 41 43 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  ACE).const char 
8160: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
8170: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
8180: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
8190: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
81a0: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
81b0: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
81c0: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
81d0: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
81e0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
81f0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
8210: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
8220: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
8230: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8240: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
8250: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
8260: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
8270: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
8280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8290: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
82a0: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
82b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
82c0: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
82d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
82e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
82f0: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
8300: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8310: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
8320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8330: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
8340: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
8350: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8360: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
8370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8380: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
8390: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
83a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
83b0: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
83c0: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
83d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
83e0: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
83f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8400: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
8410: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8420: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8430: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
8440: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8450: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
8460: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
8470: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8480: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
8490: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
84a0: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
84b0: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
84c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
84d0: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
84e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
84f0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
8500: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8510: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8520: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
8530: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
8540: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
8550: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
8560: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
8580: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8590: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
85b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
85c0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
85d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
85e0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
85f0: 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  LY";          br
8600: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8610: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
8620: 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65  RECOVERY:  zName
8630: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
8640: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62  NLY_RECOVERY"; b
8650: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8660: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
8670: 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d  _CANTLOCK:  zNam
8680: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
8690: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
86a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
86b0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
86c0: 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61  Y_ROLLBACK:  zNa
86d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
86e0: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b  DONLY_ROLLBACK";
86f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8700: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  se SQLITE_INTERR
8710: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  UPT:          zN
8720: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
8730: 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  TERRUPT";       
8740: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8750: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8760: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
8770: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8780: 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20  OERR";          
8790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
87a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
87b0: 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20  R_READ:         
87c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
87d0: 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20  IOERR_READ";    
87e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
87f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8800: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20  RR_SHORT_READ:  
8810: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8820: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
8830: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
8840: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8850: 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20  ERR_WRITE:      
8860: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8870: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20  E_IOERR_WRITE"; 
8880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8890: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
88a0: 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20  OERR_FSYNC:     
88b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
88c0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b  TE_IOERR_FSYNC";
88d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
88e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
88f0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a  IOERR_DIR_FSYNC:
8900: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8910: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
8920: 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  YNC";   break;. 
8930: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8940: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a  _IOERR_TRUNCATE:
8950: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8960: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
8970: 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATE";    break;.
8980: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8990: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20  E_IOERR_FSTAT:  
89a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
89b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
89c0: 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  T";       break;
89d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
89e0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a  TE_IOERR_UNLOCK:
89f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8a00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
8a10: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
8a20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8a30: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
8a40: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
8a50: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44  "SQLITE_IOERR_RD
8a60: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
8a70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8a80: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
8a90: 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  E:       zName =
8aa0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
8ab0: 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65  ELETE";      bre
8ac0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8ad0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
8ae0: 4b 45 44 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  KED:      zName 
8af0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8b00: 42 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 62 72  BLOCKED";     br
8b10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8b20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
8b30: 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  EM:        zName
8b40: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8b50: 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62  _NOMEM";       b
8b60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8b70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
8b80: 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d  CESS:       zNam
8b90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8ba0: 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20  R_ACCESS";      
8bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8bc0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
8bd0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
8be0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8c10: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
8c20: 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61  ERVEDLOCK"; brea
8c30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8c40: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a  LITE_IOERR_LOCK:
8c50: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8c60: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c   "SQLITE_IOERR_L
8c70: 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  OCK";        bre
8c80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8c90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
8ca0: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
8cb0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8cc0: 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72  CLOSE";       br
8cd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8ce0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
8cf0: 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65  _CLOSE:    zName
8d00: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8d10: 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62  _DIR_CLOSE";   b
8d20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8d30: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
8d40: 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d  MOPEN:      zNam
8d50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8d60: 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20  R_SHMOPEN";     
8d70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8d80: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8d90: 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61  HMSIZE:      zNa
8da0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8db0: 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20  RR_SHMSIZE";    
8dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8dd0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8de0: 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e  SHMLOCK:      zN
8df0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8e00: 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20  ERR_SHMLOCK";   
8e10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8e20: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8e30: 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a  _SHMMAP:       z
8e40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8e50: 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20  OERR_SHMMAP";   
8e60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8e70: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8e80: 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20  R_SEEK:         
8e90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8ea0: 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20  IOERR_SEEK";    
8eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8ec0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8ed0: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a  RR_DELETE_NOENT:
8ee0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8ef0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
8f00: 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ENT";break;.    
8f10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8f20: 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20  ERR_MMAP:       
8f30: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8f40: 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20  E_IOERR_MMAP";  
8f50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8f60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
8f70: 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20  ORRUPT:         
8f80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8f90: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
8fa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8fb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8fc0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20  CORRUPT_VTAB:   
8fd0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8fe0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
8ff0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9000: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9010: 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20  _NOTFOUND:      
9020: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9030: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20  LITE_NOTFOUND"; 
9040: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9050: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9060: 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20  E_FULL:         
9070: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9080: 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20  QLITE_FULL";    
9090: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
90a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
90b0: 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20  TE_CANTOPEN:    
90c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
90d0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22  SQLITE_CANTOPEN"
90e0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
90f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9100: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54  ITE_CANTOPEN_NOT
9110: 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20  EMPDIR: zName = 
9120: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
9130: 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61  _NOTEMPDIR";brea
9140: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9150: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
9160: 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  DIR:     zName =
9170: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
9180: 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72 65  N_ISDIR";    bre
9190: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
91a0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
91b0: 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  ULLPATH:  zName 
91c0: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
91d0: 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72  EN_FULLPATH"; br
91e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
91f0: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a  SQLITE_PROTOCOL:
9200: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9210: 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f   = "SQLITE_PROTO
9220: 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  COL";          b
9230: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9240: 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20   SQLITE_EMPTY:  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9260: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54  e = "SQLITE_EMPT
9270: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
9280: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9290: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
92b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48  me = "SQLITE_SCH
92c0: 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20  EMA";           
92d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
92e0: 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  se SQLITE_TOOBIG
92f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
9300: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f  ame = "SQLITE_TO
9310: 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20  OBIG";          
9320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9330: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9340: 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a  RAINT:         z
9350: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9360: 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20  ONSTRAINT";     
9370: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9380: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
9390: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20  TRAINT_UNIQUE:  
93a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
93b0: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
93c0: 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E"; break;.     
93d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
93e0: 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a  STRAINT_TRIGGER:
93f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9400: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
9410: 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  GER";break;.    
9420: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
9430: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
9440: 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20  KEY:.           
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9470: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9480: 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62  FOREIGNKEY";   b
9490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
94a0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
94b0: 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d  NT_CHECK:   zNam
94c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
94d0: 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20  TRAINT_CHECK";  
94e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
94f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9500: 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a  INT_PRIMARYKEY:.
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9540: 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
9550: 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b  RYKEY";   break;
9560: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9570: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
9580: 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22  TNULL: zName = "
9590: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
95a0: 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b  T_NOTNULL";break
95b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
95c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
95d0: 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20  OMMITHOOK:.     
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9600: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
9610: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
9620: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
9640: 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20  NSTRAINT_VTAB:  
9650: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9660: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
9670: 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  B";   break;.   
9680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9690: 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49  ONSTRAINT_FUNCTI
96a0: 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ON:.            
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
96d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
96e0: 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72  UNCTION";     br
96f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9700: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a  SQLITE_MISMATCH:
9710: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9720: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
9730: 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62  TCH";          b
9740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9750: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20   SQLITE_MISUSE: 
9760: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9770: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
9780: 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SE";            
9790: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
97a0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
97c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
97d0: 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  FS";            
97e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
97f0: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9810: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
9820: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
9830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9840: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
9850: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
9860: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
9870: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
9880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9890: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
98a0: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
98b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
98c0: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20  RANGE";         
98d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
98e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
98f0: 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20  ADB:            
9900: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9910: 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20  _NOTADB";       
9920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9930: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
9940: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
9950: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9960: 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20  E_ROW";         
9970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9980: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
9990: 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20  OTICE:          
99a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
99b0: 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20  TE_NOTICE";     
99c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
99d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
99e0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
99f0: 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  AL: zName = "SQL
9a00: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
9a10: 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20  ER_WAL";break;. 
9a20: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9a30: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
9a40: 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20  ROLLBACK:.      
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9a70: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
9a80: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
9a90: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
9aa0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
9ab0: 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20  NING:           
9ac0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ad0: 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20  _WARNING";      
9ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9af0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
9b00: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a  RNING_AUTOINDEX:
9b10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9b20: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
9b30: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
9b40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
9b50: 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ONE:            
9b60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9b70: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
9b80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9b90: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e    }.  }.  if( zN
9ba0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ame==0 ){.    st
9bb0: 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35  atic char zBuf[5
9bc0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
9bd0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
9be0: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51  zBuf), zBuf, "SQ
9bf0: 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29  LITE_UNKNOWN(%d)
9c00: 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20  ", origRc);.    
9c10: 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zName = zBuf;.  
9c20: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
9c30: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
9c40: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
9c50: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
9c60: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
9c70: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
9c80: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
9c90: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
9ca0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
9cb0: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
9cc0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
9cd0: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
9ce0: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
9cf0: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
9d00: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
9d10: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
9d20: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
9d30: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
9d40: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
9d50: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
9d60: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
9d70: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
9d80: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
9d90: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
9da0: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
9db0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
9dc0: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
9dd0: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
9de0: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
9df0: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
9e00: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
9e10: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
9e20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
9e30: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
9e40: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
9e50: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
9e60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
9e70: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
9e80: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
9e90: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
9ea0: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
9eb0: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
9ec0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
9ed0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
9ee0: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
9ef0: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
9f00: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
9f10: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
9f20: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
9f30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
9f40: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
9f50: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
9f60: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
9f70: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
9f80: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
9f90: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
9fa0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
9fb0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
9fc0: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
9fd0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
9fe0: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
9ff0: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
a000: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
a010: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
a020: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
a030: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
a040: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
a050: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
a060: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
a070: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
a080: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
a090: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
a0a0: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
a0b0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a0c0: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
a0d0: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
a0e0: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
a0f0: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
a100: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
a110: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
a120: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
a130: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
a140: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
a150: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
a160: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
a170: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
a180: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
a190: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
a1a0: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
a1b0: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
a1c0: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
a1d0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a1e0: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
a1f0: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
a200: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
a210: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
a220: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
a230: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
a240: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
a250: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
a260: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
a270: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
a280: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
a290: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
a2a0: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
a2b0: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
a2c0: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
a2d0: 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ",.  };.  const 
a2e0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e  char *zErr = "un
a2f0: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
a300: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
a310: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
a320: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a  ORT_ROLLBACK: {.
a330: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62        zErr = "ab
a340: 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42  ort due to ROLLB
a350: 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ACK";.      brea
a360: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
a370: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
a380: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
a390: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
a3a0: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
a3b0: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
a3c0: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
a3d0: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
a3e0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
a3f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a400: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
a410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
a420: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
a430: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
a440: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
a450: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
a460: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
a470: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
a480: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
a490: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
a4a0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
a4b0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
a4c0: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
a4d0: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
a4e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a4f0: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
a500: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64  yCallback(. void
a510: 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20   *ptr,          
a520: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
a530: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
a540: 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20  int count       
a550: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a560: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c  er of times tabl
a570: 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20  e has been busy 
a580: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
a590: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69  _OS_WIN || (defi
a5a0: 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
a5b0: 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29   && HAVE_USLEEP)
a5c0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a5d0: 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20  u8 delays[] =.  
a5e0: 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30     { 1, 2, 5, 10
a5f0: 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35  , 15, 20, 25, 25
a600: 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c  ,  25,  50,  50,
a610: 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63   100 };.  static
a620: 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73   const u8 totals
a630: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31  [] =.     { 0, 1
a640: 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c  , 3,  8, 18, 33,
a650: 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32   53, 78, 103, 12
a660: 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23  8, 178, 228 };.#
a670: 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41   define NDELAY A
a680: 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29  rraySize(delays)
a690: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a6a0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
a6b0: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
a6c0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
a6d0: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
a6e0: 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rior;..  assert(
a6f0: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
a700: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
a710: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
a720: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
a730: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
a740: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
a750: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
a760: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
a770: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
a780: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
a790: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
a7a0: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
a7b0: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
a7c0: 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  ay > timeout ){.
a7d0: 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65      delay = time
a7e0: 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20  out - prior;.   
a7f0: 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20   if( delay<=0 ) 
a800: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a810: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
a820: 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31  b->pVfs, delay*1
a830: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
a840: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
a850: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
a860: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
a870: 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65  meout = ((sqlite
a880: 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69  3 *)ptr)->busyTi
a890: 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f  meout;.  if( (co
a8a0: 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69  unt+1)*1000 > ti
a8b0: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  meout ){.    ret
a8c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
a8d0: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
a8e0: 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a  pVfs, 1000000);.
a8f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
a900: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  if.}../*.** Invo
a910: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73  ke the given bus
a920: 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  y handler..**.**
a930: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a940: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
a950: 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  operation failed
a960: 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a   with a lock..**
a970: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
a980: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
a990: 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72  o, the lock is r
a9a0: 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a  etried.  If it.*
a9b0: 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65  * returns 0, the
a9c0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74   operation abort
a9d0: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
a9e0: 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a  _BUSY error..*/.
a9f0: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  int sqlite3Invok
aa00: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73  eBusyHandler(Bus
aa10: 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20  yHandler *p){.  
aa20: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45  int rc;.  if( NE
aa30: 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e  VER(p==0) || p->
aa40: 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  xFunc==0 || p->n
aa50: 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20  Busy<0 ) return 
aa60: 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75  0;.  rc = p->xFu
aa70: 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e  nc(p->pArg, p->n
aa80: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d  Busy);.  if( rc=
aa90: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  =0 ){.    p->nBu
aaa0: 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  sy = -1;.  }else
aab0: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b  {.    p->nBusy++
aac0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
aad0: 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c; .}../*.** Thi
aae0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
aaf0: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
ab00: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
ab10: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
ab20: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
ab30: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
ab40: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
ab50: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
ab60: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a  3_busy_handler(.
ab70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
ab80: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
ab90: 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  id*,int),.  void
aba0: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69   *pArg.){.  sqli
abb0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
abc0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
abd0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46  ->busyHandler.xF
abe0: 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64  unc = xBusy;.  d
abf0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70  b->busyHandler.p
ac00: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62  Arg = pArg;.  db
ac10: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
ac20: 75 73 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62  usy = 0;.  db->b
ac30: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  usyTimeout = 0;.
ac40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ac50: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
ac60: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ac70: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
ac80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
ac90: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
aca0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
acb0: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
acc0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
acd0: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
ace0: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
acf0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
ad00: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
ad10: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
ad20: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
ad30: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
ad40: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
ad50: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
ad60: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
ad70: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
ad80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
ad90: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
ada0: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
adb0: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
adc0: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
add0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ade0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
adf0: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
ae00: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
ae10: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
ae20: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f  ProgressOps = nO
ae30: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
ae40: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
ae50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
ae60: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
ae70: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
ae80: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
ae90: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
aea0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
aeb0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
aec0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
aed0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
aee0: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
aef0: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
af00: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
af10: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
af20: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
af30: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
af40: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
af50: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
af60: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
af70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
af80: 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30   ms){.  if( ms>0
af90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
afa0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
afb0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
afc0: 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  syCallback, (voi
afd0: 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e  d*)db);.    db->
afe0: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73  busyTimeout = ms
aff0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
b000: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
b010: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
b020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
b030: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b040: 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e  Cause any pendin
b050: 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73  g operation to s
b060: 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69  top at its earli
b070: 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  est opportunity.
b080: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b090: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
b0a0: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75  e3 *db){.  db->u
b0b0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
b0c0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
b0d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b0e0: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
b0f0: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
b100: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
b110: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
b120: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
b130: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
b140: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
b150: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
b160: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
b170: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
b180: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
b190: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
b1a0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
b1b0: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
b1c0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
b1d0: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
b1e0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
b1f0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
b200: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b210: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
b220: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
b230: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
b240: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
b250: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
b260: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
b270: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
b280: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
b290: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
b2a0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
b2b0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
b2c0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
b2d0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
b2e0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
b2f0: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
b300: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
b310: 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  t nName;..  asse
b320: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b330: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
b340: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
b350: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
b360: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
b370: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
b380: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
b390: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
b3a0: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
b3b0: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
b3c0: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
b3d0: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
b3e0: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
b3f0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
b400: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
b410: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
b420: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
b430: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
b440: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
b450: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
b460: 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20  .  }.  .#ifndef 
b470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
b480: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
b490: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
b4a0: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
b4b0: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
b4c0: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
b4d0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
b4e0: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
b4f0: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
b500: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
b510: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
b520: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
b530: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
b540: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
b550: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
b560: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
b570: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
b580: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
b590: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
b5a0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
b5b0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
b5c0: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
b5d0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
b5e0: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
b5f0: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
b600: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
b610: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b620: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
b630: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
b640: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
b650: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
b660: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
b670: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
b680: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
b690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b6a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b6b0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
b6c0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
b6d0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
b6e0: 55 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20  UTF16LE,.       
b6f0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
b700: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
b710: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
b720: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b730: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
b750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
b760: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
b770: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
b780: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
b790: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
b7a0: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
b7b0: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
b7c0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
b7d0: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
b7e0: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
b7f0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
b800: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
b810: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
b820: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
b830: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
b840: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
b850: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
b860: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
b870: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
b880: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
b890: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
b8a0: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
b8b0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
b8c0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
b8d0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
b8e0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
b8f0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
b900: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
b910: 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63  p->iPrefEnc==enc
b920: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
b930: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
b940: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
b950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b960: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
b970: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
b980: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
b990: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
b9a0: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
b9b0: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
b9c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
b9d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b9e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b9f0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
ba00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ba10: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
ba20: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
ba30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ba40: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
ba50: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
ba60: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
ba70: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
ba80: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
ba90: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
baa0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
bab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
bac0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
bad0: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
bae0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
baf0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
bb00: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
bb10: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
bb20: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
bb30: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
bb40: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
bb50: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
bb60: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
bb70: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
bb80: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
bb90: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
bba0: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
bbb0: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
bbc0: 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30  ;.  p->flags = 0
bbd0: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
bbe0: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
bbf0: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
bc00: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
bc10: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
bc20: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
bc30: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
bc40: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
bc50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bc60: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
bc70: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
bc80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
bc90: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
bca0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
bcb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
bcc0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
bcd0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
bce0: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
bcf0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
bd00: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
bd10: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
bd20: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
bd30: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
bd40: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
bd50: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
bd60: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
bd70: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
bd80: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
bd90: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
bda0: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
bdb0: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
bdc0: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
bdf0: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
be00: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
be10: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
be20: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
be30: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
be40: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
be50: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
be60: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
be70: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
be80: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
be90: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
bea0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
beb0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
bec0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
bed0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
bee0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
bef0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
bf00: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
bf10: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bf20: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
bf30: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
bf40: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
bf50: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
bf60: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
bf70: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
bf80: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
bf90: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
bfa0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
bfb0: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
bfc0: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
bfd0: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
bfe0: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
bff0: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
c000: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
c010: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
c020: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
c030: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
c040: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
c050: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
c060: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
c070: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
c080: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
c090: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
c0a0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
c0b0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c0c0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
c0d0: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
c0e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c0f0: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
c100: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
c110: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
c120: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c130: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
c140: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c150: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c160: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
c170: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c180: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
c190: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
c1a0: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
c1b0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
c1c0: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
c1d0: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
c1e0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c1f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c200: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c210: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
c220: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
c230: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c240: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c250: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
c260: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
c270: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
c280: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
c290: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c2a0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c2b0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
c2c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
c2d0: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
c2e0: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
c2f0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
c300: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c310: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
c320: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c330: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
c340: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
c350: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
c360: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
c370: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
c380: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c390: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
c3a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c3b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
c3c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c3d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c3e0: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
c3f0: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
c400: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
c410: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
c420: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
c430: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
c440: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
c450: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
c460: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
c470: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
c480: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
c490: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
c4a0: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
c4b0: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
c4c0: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
c4d0: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
c4e0: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
c4f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
c500: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
c510: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
c520: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
c530: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
c540: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
c550: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
c560: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
c570: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
c580: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
c590: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
c5a0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
c5b0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
c5c0: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
c5d0: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
c5e0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
c5f0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
c600: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
c610: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
c620: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
c630: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
c640: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c650: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
c660: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
c670: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
c680: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
c690: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
c6a0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
c6b0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
c6c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c6d0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
c6e0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
c6f0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
c720: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
c730: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
c740: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
c750: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
c760: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
c770: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
c780: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
c790: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c7a0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
c7b0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
c7c0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
c7d0: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
c7e0: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
c7f0: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
c800: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
c810: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
c820: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
c830: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
c840: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
c850: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
c860: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c870: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
c880: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
c890: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
c8a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
c8b0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
c8c0: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
c8d0: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
c8e0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
c8f0: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
c900: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
c910: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
c920: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
c930: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
c940: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
c950: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
c960: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
c970: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
c980: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
c990: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
c9a0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
c9b0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
c9c0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
c9d0: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
c9e0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
c9f0: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
ca00: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
ca10: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
ca20: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
ca30: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
ca40: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
ca50: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
ca60: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
ca70: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
ca80: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
ca90: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
caa0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
cab0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
cac0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
cad0: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
cae0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
caf0: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
cb00: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
cb10: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
cb20: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
cb30: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
cb40: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
cb50: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
cb60: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
cb70: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
cb80: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
cb90: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
cba0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
cbb0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
cbc0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
cbd0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
cbe0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
cbf0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
cc00: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cc10: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
cc20: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
cc30: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
cc40: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
cc50: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
cc60: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
cc70: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
cc80: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
cc90: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
cca0: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
ccb0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
ccc0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
ccd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ccf0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
cd00: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
cd10: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
cd20: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
cd30: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
cd40: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
cd50: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
cd60: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
cd70: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
cd80: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
cd90: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
cda0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
cdb0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
cdc0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
cdd0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
cde0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
cdf0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
ce00: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
ce10: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
ce20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ce30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ce40: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
ce50: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
ce60: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
ce70: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
ce80: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
ce90: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
cea0: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
ceb0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
cec0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
ced0: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
cee0: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
cef0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
cf00: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
cf10: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
cf20: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
cf30: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
cf40: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
cf50: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
cf60: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
cf70: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cf90: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
cfa0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
cfb0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
cfc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
cfd0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
cfe0: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
cff0: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
d000: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
d010: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
d020: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
d030: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
d040: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d050: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d060: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
d070: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
d080: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
d090: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
d0a0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
d0b0: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
d0c0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
d0d0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
d0e0: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
d0f0: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
d100: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d110: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d120: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d130: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d140: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d150: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
d160: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
d170: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d190: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d1a0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d1b0: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
d1c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d1d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d1e0: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
d1f0: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
d200: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
d210: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
d220: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
d230: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d240: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d250: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d260: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
d270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d280: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
d290: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
d2a0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
d2b0: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
d2c0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
d2d0: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
d2e0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
d2f0: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
d300: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
d310: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
d320: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
d330: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
d340: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
d350: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
d360: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
d370: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
d380: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
d390: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
d3a0: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
d3b0: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
d3c0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
d3d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d3e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
d3f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
d400: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
d410: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
d420: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
d430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
d440: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
d450: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
d460: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
d470: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
d480: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
d490: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d4a0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
d4b0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
d4c0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
d4d0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d4e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
d4f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
d500: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d510: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
d520: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
d530: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
d540: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
d550: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
d560: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
d570: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
d580: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
d590: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
d5a0: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
d5b0: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
d5c0: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
d5d0: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
d5e0: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
d5f0: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
d600: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
d610: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
d620: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
d630: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
d640: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
d650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
d660: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
d670: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
d680: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
d690: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
d6a0: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
d6b0: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
d6c0: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
d6d0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
d6e0: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
d6f0: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
d700: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
d710: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
d720: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
d730: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
d740: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
d750: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
d760: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
d770: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
d780: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d790: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
d7a0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
d7b0: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
d7c0: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
d7d0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
d7e0: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
d7f0: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
d800: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
d810: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
d820: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
d830: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
d840: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
d850: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d860: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
d870: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
d880: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
d890: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
d8a0: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
d8b0: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
d8c0: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
d8d0: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
d8e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
d8f0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
d900: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d930: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d940: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
d950: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
d960: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
d970: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
d980: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
d9b0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
d9c0: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
d9d0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
d9e0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
d9f0: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
da00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
da10: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
da20: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
da30: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
da40: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
da50: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
da60: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
da70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
da80: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
da90: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
daa0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
dab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
dac0: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
dad0: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
dae0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
daf0: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
db00: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
db10: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
db20: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
db30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db50: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
db60: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
db70: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
db80: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
db90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
dba0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
dbb0: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
dbc0: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbe0: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
dbf0: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
dc00: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
dc30: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
dc40: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
dc50: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
dc60: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
dc70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dc80: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
dcb0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
dcc0: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
dcd0: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
dce0: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
dcf0: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
dd00: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
dd10: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
dd20: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
dd30: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
dd40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
dd50: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
dd60: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
dd70: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
dd80: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
dd90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
dda0: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
ddb0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
ddc0: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
ddd0: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
dde0: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
ddf0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
de00: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
de10: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
de20: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
de30: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
de40: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
de50: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
de60: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
de70: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
de80: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
de90: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
dea0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
deb0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
dec0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ded0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
dee0: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
def0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
df00: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
df10: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
df20: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
df30: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
df40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
df50: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
df60: 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
df70: 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
df80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
df90: 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
dfa0: 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
dfb0: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
dfc0: 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
dfd0: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
dfe0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
dff0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
e000: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
e010: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e020: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e030: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
e040: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
e050: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
e060: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
e070: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
e080: 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
e090: 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
e0a0: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
e0b0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
e0c0: 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
e0d0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
e0e0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
e0f0: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
e100: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
e110: 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72  r *zDb){.  retur
e120: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
e130: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20  eckpoint_v2(db, 
e140: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43  zDb, SQLITE_CHEC
e150: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
e160: 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  0, 0);.}..#ifnde
e170: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
e180: 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
e190: 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
e1a0: 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
e1b0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
e1c0: 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
e1d0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
e1e0: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
e1f0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
e200: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
e210: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
e220: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
e230: 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
e240: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
e250: 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
e260: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
e270: 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
e280: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
e290: 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
e2a0: 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
e2b0: 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
e2c0: 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
e2d0: 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
e2e0: 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
e2f0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
e300: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
e310: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
e320: 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
e330: 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
e340: 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
e350: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
e360: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
e370: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
e380: 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
e390: 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
e3a0: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
e3b0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
e3c0: 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
e3d0: 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
e3e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
e3f0: 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
e400: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
e410: 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
e420: 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
e430: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
e440: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
e450: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
e460: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
e470: 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
e480: 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
e490: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
e4a0: 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
e4b0: 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
e4c0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
e4d0: 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
e4e0: 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
e4f0: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
e500: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
e510: 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
e520: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
e530: 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
e540: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e560: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e570: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
e5a0: 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
e5b0: 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
e5c0: 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e5e0: 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
e5f0: 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
e600: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
e610: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e620: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
e630: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
e640: 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
e650: 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
e660: 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
e670: 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
e680: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e690: 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
e6a0: 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
e6b0: 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
e6c0: 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
e6d0: 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
e6e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
e6f0: 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
e700: 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
e710: 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
e720: 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
e730: 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
e740: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
e750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
e760: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
e770: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
e780: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e790: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e7a0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
e7b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
e7c0: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
e7d0: 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
e7e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e7f0: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
e800: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
e810: 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
e820: 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
e830: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
e840: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
e850: 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
e860: 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
e870: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
e880: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
e890: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
e8a0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
e8b0: 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
e8c0: 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
e8d0: 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
e8e0: 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
e8f0: 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
e900: 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
e910: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
e920: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
e930: 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
e940: 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
e950: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
e960: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
e970: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
e980: 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
e990: 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
e9a0: 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
e9b0: 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
e9c0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
e9d0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
e9e0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
e9f0: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
ea00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
ea40: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
ea50: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
ea60: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
ea70: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
ea80: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
ea90: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
eaa0: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
eab0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
ead0: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
eae0: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
eb20: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
eb50: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
eb60: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
eb90: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
eba0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
ebb0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
ebc0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
ebd0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
ebe0: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
ebf0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
ec00: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
ec20: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
ec30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
ec40: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
ec50: 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
ec60: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
ec70: 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
ec80: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
ec90: 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
eca0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
ecb0: 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
ecc0: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
ecd0: 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
ece0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
ecf0: 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72  STORE==3.  retur
ed00: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
ed10: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
ed20: 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
ed30: 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74  MP_STORE>3.  ret
ed40: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
ed50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
ed60: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
ed70: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
ed80: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
ed90: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
eda0: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
edb0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
edc0: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
edd0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
ede0: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
edf0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
ee00: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
ee10: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
ee20: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
ee30: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
ee40: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
ee50: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
ee60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
ee70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
ee80: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ee90: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
eea0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eeb0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
eec0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
eed0: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
eee0: 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  .    z = (char*)
eef0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
ef00: 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
ef10: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
ef20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ef30: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
ef40: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
ef50: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
ef60: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
ef70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ef80: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
ef90: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
efa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
efb0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
efc0: 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
efd0: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
efe0: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
eff0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
f000: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
f010: 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
f020: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
f030: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
f040: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
f050: 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
f060: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
f070: 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
f080: 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
f090: 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
f0a0: 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
f0b0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
f0c0: 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
f0d0: 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27  'l', 'i', 'b', '
f0e0: 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79  r', 'a', 'r', 'y
f0f0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27  ', ' ', .    'r'
f100: 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c  , 'o', 'u', 't',
f110: 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20   'i', 'n', 'e', 
f120: 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27  ' ', .    'c', '
f130: 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65  a', 'l', 'l', 'e
f140: 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'd', ' ', .  
f150: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
f160: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
f170: 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'f', ' ', .    '
f180: 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75  s', 'e', 'q', 'u
f190: 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27  ', 'e', 'n', 'c'
f1a0: 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20  , 'e', 0.  };.. 
f1b0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
f1c0: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
f1d0: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
f1e0: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20  outOfMem;.  }.  
f1f0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f200: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
f210: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
f220: 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65  n (void *)misuse
f230: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
f240: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f250: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
f260: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f270: 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20  {.    z = (void 
f280: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65  *)outOfMem;.  }e
f290: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
f2a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
f2b0: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
f2c0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
f2d0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
f2e0: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
f2f0: 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  -1, sqlite3ErrSt
f300: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a  r(db->errCode),.
f310: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
f320: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
f330: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20  TATIC);.      z 
f340: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
f350: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
f360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
f370: 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
f380: 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
f390: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
f3a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
f3b0: 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
f3c0: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
f3d0: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
f3e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f3f0: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
f400: 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
f410: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
f420: 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
f430: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
f440: 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
f450: 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
f460: 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
f470: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
f480: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
f490: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
f4a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
f4b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
f4c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f4d0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f4e0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
f4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
f500: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
f510: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
f520: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
f530: 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
f540: 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
f550: 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
f560: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
f570: 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
f580: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
f590: 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
f5a0: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
f5b0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
f5c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
f5d0: 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
f5e0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
f5f0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
f600: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
f610: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
f620: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
f630: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
f660: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
f670: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
f680: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
f690: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
f6a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
f6b0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
f6c0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
f6d0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
f6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
f6f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
f700: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
f710: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f720: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f730: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
f740: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
f750: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  de;.}../*.** Ret
f760: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
f770: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
f780: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
f790: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
f7a0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72  * argument.  For
f7b0: 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c   now, this simpl
f7c0: 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65  y calls the inte
f7d0: 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53  rnal sqlite3ErrS
f7e0: 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  tr().** function
f7f0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
f800: 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28  *sqlite3_errstr(
f810: 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72  int rc){.  retur
f820: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
f830: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  rc);.}../*.** Cr
f840: 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61  eate a new colla
f850: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
f860: 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e  r database "db".
f870: 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e    The name is zN
f880: 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  ame.** and the e
f890: 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a  ncoding is enc..
f8a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
f8b0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eateCollation(. 
f8c0: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20   sqlite3* db,.  
f8d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
f8e0: 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  e, .  u8 enc,.  
f8f0: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
f900: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
f910: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
f920: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
f930: 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
f940: 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43  l)(void*).){.  C
f950: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
f960: 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74   int enc2;.  int
f970: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
f980: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
f990: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
f9a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f9b0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
f9c0: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
f9d0: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
f9e0: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
f9f0: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
fa00: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
fa10: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
fa20: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
fa30: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
fa40: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
fa50: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
fa60: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
fa70: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
fa80: 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32  lly..  */.  enc2
fa90: 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61   = enc;.  testca
faa0: 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
fab0: 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74  _UTF16 );.  test
fac0: 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
fad0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
fae0: 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d   );.  if( enc2==
faf0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20  SQLITE_UTF16 || 
fb00: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
fb10: 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20  16_ALIGNED ){.  
fb20: 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f    enc2 = SQLITE_
fb30: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
fb40: 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49  .  if( enc2<SQLI
fb50: 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e  TE_UTF8 || enc2>
fb60: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
fb70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fb80: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
fb90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
fba0: 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   if this call is
fbb0: 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70   removing or rep
fbc0: 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69  lacing an existi
fbd0: 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20  ng collation .  
fbe0: 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20  ** sequence. If 
fbf0: 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  so, and there ar
fc00: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65  e active VMs, re
fc10: 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68  turn busy. If th
fc20: 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20  ere.  ** are no 
fc30: 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61  active VMs, inva
fc40: 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63  lidate any pre-c
fc50: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
fc60: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c  ts..  */.  pColl
fc70: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
fc80: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
fc90: 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  c2, zName, 0);. 
fca0: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
fcb0: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
fcc0: 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
fcd0: 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
fce0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
fcf0: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
fd00: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
fd10: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
fd20: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
fd30: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
fd40: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
fd50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fd60: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
fd70: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
fd80: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
fd90: 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  (db);..    /* If
fda0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
fdb0: 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
fdc0: 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
fdd0: 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
fde0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
fdf0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
fe00: 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
fe10: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
fe20: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
fe30: 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
fe40: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
fe50: 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
fe60: 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
fe70: 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
fe80: 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
fe90: 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
fea0: 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
feb0: 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
fec0: 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
fed0: 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
fee0: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
fef0: 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
ff00: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
ff10: 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
ff20: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
ff30: 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e  ollSeq, zName, n
ff40: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  Name);.      int
ff50: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
ff60: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
ff70: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
ff80: 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20   = &aColl[j];.  
ff90: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63        if( p->enc
ffa0: 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
ffb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
ffc0: 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >xDel ){.       
ffd0: 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e       p->xDel(p->
ffe0: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pUser);.        
fff0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
10000 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  >xCmp = 0;.     
10010 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10020 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20   }.  }..  pColl 
10030 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
10040 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
10050 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20  2, zName, 1);.  
10060 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72  if( pColl==0 ) r
10070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10080 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d  EM;.  pColl->xCm
10090 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20  p = xCompare;.  
100a0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70  pColl->pUser = p
100b0 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44  Ctx;.  pColl->xD
100c0 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f  el = xDel;.  pCo
100d0 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65  ll->enc = (u8)(e
100e0 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c  nc2 | (enc & SQL
100f0 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
10100 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72  D));.  sqlite3Er
10110 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
10120 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  K, 0);.  return 
10130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
10140 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20  *.** This array 
10150 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70  defines hard upp
10160 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d  er bounds on lim
10170 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a  it values.  The.
10180 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d  ** initializer m
10190 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73  ust be kept in s
101a0 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c  ync with the SQL
101b0 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23  ITE_LIMIT_*.** #
101c0 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74  defines in sqlit
101d0 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e3.h..*/.static 
101e0 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c  const int aHardL
101f0 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c  imit[] = {.  SQL
10200 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a  ITE_MAX_LENGTH,.
10210 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c    SQLITE_MAX_SQL
10220 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
10230 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20  E_MAX_COLUMN,.  
10240 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
10250 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
10260 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
10270 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ECT,.  SQLITE_MA
10280 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c  X_VDBE_OP,.  SQL
10290 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
102a0 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  _ARG,.  SQLITE_M
102b0 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53  AX_ATTACHED,.  S
102c0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
102d0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20  ATTERN_LENGTH,. 
102e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
102f0 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53  ABLE_NUMBER,.  S
10300 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
10310 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a  R_DEPTH,.};../*.
10320 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
10330 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65   hard limits are
10340 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62   set to reasonab
10350 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66  le values.*/.#if
10360 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
10370 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
10380 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
10390 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
103a0 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
103b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
103c0 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
103d0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
103e0 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  L_LENGTH must be
103f0 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
10400 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10410 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53  MAX_SQL_LENGTH>S
10420 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
10430 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10440 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
10450 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74  ust not be great
10460 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  er than SQLITE_M
10470 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66  AX_LENGTH.#endif
10480 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10490 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c  COMPOUND_SELECT<
104a0 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  2.# error SQLITE
104b0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
104c0 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20  LECT must be at 
104d0 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23  least 2.#endif.#
104e0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  if SQLITE_MAX_VD
104f0 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72  BE_OP<40.# error
10500 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
10510 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c  _OP must be at l
10520 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23  east 40.#endif.#
10530 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  if SQLITE_MAX_FU
10540 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20  NCTION_ARG<0 || 
10550 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10560 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65  ION_ARG>1000.# e
10570 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10580 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73  FUNCTION_ARG mus
10590 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
105a0 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23  nd 1000.#endif.#
105b0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  if SQLITE_MAX_AT
105c0 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49  TACHED<0 || SQLI
105d0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e  TE_MAX_ATTACHED>
105e0 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  62.# error SQLIT
105f0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d  E_MAX_ATTACHED m
10600 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
10610 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66 0a 23   and 62.#endif.#
10620 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  if SQLITE_MAX_LI
10630 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
10640 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
10650 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
10660 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  ERN_LENGTH must 
10670 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
10680 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10690 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37  MAX_COLUMN>32767
106a0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
106b0 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20  MAX_COLUMN must 
106c0 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37  not exceed 32767
106d0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
106e0 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
106f0 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  EPTH<1.# error S
10700 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
10710 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20  R_DEPTH must be 
10720 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
10730 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
10740 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
10750 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
10760 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
10770 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
10780 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
10790 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
107a0 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
107b0 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
107c0 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
107d0 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
107e0 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
107f0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
10800 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
10810 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
10820 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
10830 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
10840 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
10850 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
10860 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
10870 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
10880 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
10890 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
108a0 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
108b0 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
108c0 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20  nt oldLimit;... 
108d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
108e0 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46   R-30189-54097 F
108f0 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61  or each limit ca
10900 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49  tegory SQLITE_LI
10910 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68  MIT_NAME.  ** th
10920 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75 70  ere is a hard up
10930 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74  per bound set at
10940 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79   compile-time by
10950 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f   a C preprocesso
10960 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c  r.  ** macro cal
10970 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e  led SQLITE_MAX_N
10980 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49  AME. (The "_LIMI
10990 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  T_" in the name 
109a0 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20  is changed to.  
109b0 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a  ** "_MAX_".).  *
109c0 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  /.  assert( aHar
109d0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
109e0 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  MIT_LENGTH]==SQL
109f0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29  ITE_MAX_LENGTH )
10a00 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
10a10 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
10a20 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d  MIT_SQL_LENGTH]=
10a30 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f  =SQLITE_MAX_SQL_
10a40 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
10a50 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
10a60 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
10a70 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  MN]==SQLITE_MAX_
10a80 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65  COLUMN );.  asse
10a90 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
10aa0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
10ab0 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
10ac0 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29  MAX_EXPR_DEPTH )
10ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
10ae0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
10af0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
10b00 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ECT]==SQLITE_MAX
10b10 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
10b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
10b30 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
10b40 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53  IMIT_VDBE_OP]==S
10b50 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
10b60 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  P );.  assert( a
10b70 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
10b80 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
10b90 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ARG]==SQLITE_MAX
10ba0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b  _FUNCTION_ARG );
10bb0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
10bc0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
10bd0 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51  IT_ATTACHED]==SQ
10be0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10bf0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
10c00 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
10c10 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
10c20 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20  ERN_LENGTH]==.  
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
10c60 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
10c70 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  TERN_LENGTH );. 
10c80 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
10c90 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10ca0 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
10cb0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  ]==SQLITE_MAX_VA
10cc0 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
10cd0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
10ce0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
10cf0 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d  T_TRIGGER_DEPTH]
10d00 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  ==SQLITE_MAX_TRI
10d10 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  GGER_DEPTH );.  
10d20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c  assert( SQLITE_L
10d30 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
10d40 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49  TH==(SQLITE_N_LI
10d50 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66  MIT-1) );...  if
10d60 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c  ( limitId<0 || l
10d70 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e  imitId>=SQLITE_N
10d80 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65  _LIMIT ){.    re
10d90 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f  turn -1;.  }.  o
10da0 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c  ldLimit = db->aL
10db0 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
10dc0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
10dd0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
10de0 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
10df0 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20  52476-28732 */. 
10e00 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
10e10 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
10e20 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  Id] ){.      new
10e30 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d  Limit = aHardLim
10e40 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a  it[limitId];  /*
10e50 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35   IMP: R-51463-25
10e60 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  634 */.    }.   
10e70 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
10e80 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  tId] = newLimit;
10e90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c  .  }.  return ol
10ea0 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  dLimit;         
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10ec0 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31  MP: R-53341-3541
10ed0 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  9 */.}../*.** Th
10ee0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
10ef0 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74  sed to parse bot
10f00 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55  h URIs and non-U
10f10 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73  RI filenames pas
10f20 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73  sed by the.** us
10f30 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69  er to API functi
10f40 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ons sqlite3_open
10f50 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  () or sqlite3_op
10f60 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72  en_v2(), and for
10f70 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49   database.** URI
10f80 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  s specified as p
10f90 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73 74  art of ATTACH st
10fa0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
10fb0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
10fc0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
10fd0 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ion is the name 
10fe0 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
10ff0 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20  e (or.** a NULL 
11000 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20 64  to signify the d
11010 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20 74  efault VFS) if t
11020 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20  he URI does not 
11030 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78  contain a "vfs=x
11040 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  xx".** query par
11050 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f  ameter. The seco
11060 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74  nd argument cont
11070 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72  ains the URI (or
11080 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
11090 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68  e).** itself. Wh
110a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
110b0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a   is called the *
110c0 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20  pFlags variable 
110d0 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a  should contain.*
110e0 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c  * the default fl
110f0 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ags to open the 
11100 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
11110 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20  with. The value 
11120 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46  stored in.** *pF
11130 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64 61  lags may be upda
11140 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  ted before retur
11150 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49 20  ning if the URI 
11160 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e  filename contain
11170 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78  s .** "cache=xxx
11180 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20  " or "mode=xxx" 
11190 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
111a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
111b0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
111c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
111d0 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56 66   this case *ppVf
111e0 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  s is set to poin
111f0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20  t to.** the VFS 
11200 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
11210 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  sed to open the 
11220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
11230 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f  pzFile is set to
11240 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  .** point to a b
11250 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
11260 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11270 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49   file to open. I
11280 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
11290 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
112a0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
112b0 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c  ntually call sql
112c0 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72  ite3_free() to r
112d0 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62  elease.** this b
112e0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uffer..**.** If 
112f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11300 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20   then an SQLite 
11310 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
11320 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72  turned and *pzEr
11330 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73  rMsg.** may be s
11340 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
11350 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
11360 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ng an English la
11370 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a  nguage error .**
11380 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
11390 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
113a0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
113b0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
113c0 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62  elease.** this b
113d0 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67  uffer by calling
113e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
113f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
11400 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74  arseUri(.  const
11410 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56   char *zDefaultV
11420 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46  fs,        /* VF
11430 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22  S to use if no "
11440 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f  vfs=xxx" query o
11450 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ption */.  const
11460 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20   char *zUri,    
11470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11480 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49  l-terminated URI
11490 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75   to parse */.  u
114a0 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c  nsigned int *pFl
114b0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ags,           /
114c0 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45  * IN/OUT: SQLITE
114d0 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
114e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
114f0 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20   **ppVfs,       
11500 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53       /* OUT: VFS
11510 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68   to use */ .  ch
11520 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20  ar **pzFile,    
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11540 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63   OUT: Filename c
11550 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20  omponent of URI 
11560 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
11570 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
11580 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
11590 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20 72  or message (if r
115a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f  c!=SQLITE_OK) */
115b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
115c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69  QLITE_OK;.  unsi
115d0 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d  gned int flags =
115e0 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73   *pFlags;.  cons
115f0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a  t char *zVfs = z
11600 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68  DefaultVfs;.  ch
11610 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61  ar *zFile;.  cha
11620 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20  r c;.  int nUri 
11630 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11640 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65  0(zUri);..  asse
11650 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30  rt( *pzErrMsg==0
11660 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61   );..  if( ((fla
11670 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
11680 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74 65 33  _URI) || sqlite3
11690 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
116a0 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20 6e 55  enUri) .   && nU
116b0 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28  ri>=5 && memcmp(
116c0 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35  zUri, "file:", 5
116d0 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63  )==0 .  ){.    c
116e0 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69  har *zOpt;.    i
116f0 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  nt eState;      
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11710 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68 65  Parser state whe
11720 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f  n parsing URI */
11730 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20  .    int iIn;   
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72     /* Input char
11760 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
11770 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b     int iOut = 0;
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61   /* Output chara
117a0 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cter index */.  
117b0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 55    int nByte = nU
117c0 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20  ri+2;           
117d0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
117e0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  e to allocate */
117f0 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
11800 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50  re the SQLITE_OP
11810 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73  EN_URI flag is s
11820 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  et to indicate t
11830 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20  o the VFS xOpen 
11840 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74  .    ** method t
11850 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  hat there may be
11860 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65 72   extra parameter
11870 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
11880 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20  file-name.  */. 
11890 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
118a0 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20  TE_OPEN_URI;..  
118b0 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e    for(iIn=0; iIn
118c0 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42  <nUri; iIn++) nB
118d0 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e  yte += (zUri[iIn
118e0 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69  ]=='&');.    zFi
118f0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
11900 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  loc(nByte);.    
11910 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
11920 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11930 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  ;..    /* Discar
11940 64 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e 64  d the scheme and
11950 20 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d 65   authority segme
11960 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e 20  nts of the URI. 
11970 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b  */.    if( zUri[
11980 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b  5]=='/' && zUri[
11990 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  6]=='/' ){.     
119a0 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20   iIn = 7;.      
119b0 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
119c0 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
119d0 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a 20 20 20  /' ) iIn++;..   
119e0 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26 26     if( iIn!=7 &&
119f0 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d   (iIn!=16 || mem
11a00 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c  cmp("localhost",
11a10 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20 29   &zUri[7], 9)) )
11a20 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
11a30 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
11a40 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 75  rintf("invalid u
11a50 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25 2e  ri authority: %.
11a60 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  *s", .          
11a70 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37    iIn-7, &zUri[7
11a80 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
11a90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11aa0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
11ab0 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
11ac0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11ad0 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 20 20 20      iIn = 5;.   
11ae0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
11af0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
11b00 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d   any query param
11b10 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a  eters into the z
11b20 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20  File buffer. .  
11b30 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20    ** Decode %HH 
11b40 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f  escape codes alo
11b50 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20  ng the way. .   
11b60 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69   **.    ** Withi
11b70 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72  n this loop, var
11b80 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79  iable eState may
11b90 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20   be set to 0, 1 
11ba0 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a  or 2, depending.
11bb0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61      ** on the pa
11bc0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41  rsing context. A
11bd0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
11be0 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61  *.    **   0: Pa
11bf0 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e  rsing file-name.
11c00 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72  .    **   1: Par
11c10 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f  sing name sectio
11c20 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
11c30 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
11c40 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50  r..    **   2: P
11c50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63  arsing value sec
11c60 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
11c70 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
11c80 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eter..    */.   
11c90 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20   eState = 0;.   
11ca0 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
11cb0 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
11cc0 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='#' ){.      iI
11cd0 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  n++;.      if( c
11ce0 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26  =='%' .       &&
11cf0 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
11d00 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20  (zUri[iIn]) .   
11d10 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
11d20 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b  xdigit(zUri[iIn+
11d30 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  1]) .      ){.  
11d40 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20        int octet 
11d50 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49  = (sqlite3HexToI
11d60 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20  nt(zUri[iIn++]) 
11d70 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f  << 4);.        o
11d80 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48  ctet += sqlite3H
11d90 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
11da0 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  ++]);..        a
11db0 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20  ssert( octet>=0 
11dc0 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a  && octet<256 );.
11dd0 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65          if( octe
11de0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
11df0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
11e00 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22   is taken when "
11e10 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74  %00" appears wit
11e20 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20  hin the URI. In 
11e30 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
11e40 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65  * case we ignore
11e50 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65   all text in the
11e60 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
11e70 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a  e path, name or.
11e80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
11e90 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ue currently bei
11ea0 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67  ng parsed. So ig
11eb0 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  nore the current
11ec0 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20   character.     
11ed0 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70       ** and skip
11ee0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22   to the next "?"
11ef0 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73  , "=" or "&", as
11f00 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f   appropriate. */
11f10 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
11f20 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
11f30 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a  )!=0 && c!='#' .
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
11f50 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63   (eState!=0 || c
11f60 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20  !='?').         
11f70 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
11f80 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26  =1 || (c!='=' &&
11f90 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20   c!='&')).      
11fa0 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
11fb0 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29  te!=2 || c!='&')
11fc0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
11fd0 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b            iIn++;
11fe0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11ff0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
12000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12010 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
12020 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
12030 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
12040 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
12050 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
12060 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
12070 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
12080 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
12090 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
120a0 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
120b0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
120c0 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
120d0 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
120e0 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
120f0 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
12100 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
12110 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
12120 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
12130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
12140 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
12150 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
12160 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
12170 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
12180 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
12190 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
121a0 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
121b0 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
121c0 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
121d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
121e0 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
121f0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
12200 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
12210 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
12220 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
12230 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
12240 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
12250 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
12260 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
12270 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
12280 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
12290 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
122a0 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
122b0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
122c0 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
122d0 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
122e0 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
122f0 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
12300 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
12310 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
12320 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
12330 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
12340 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
12350 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
12360 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
12370 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
12380 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
12390 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
123a0 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
123b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
123c0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
123d0 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
123e0 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
123f0 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
12400 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
12410 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
12420 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
12430 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
12440 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
12450 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
12460 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
12470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12480 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
12490 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
124a0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
124b0 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
124c0 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
124d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
124e0 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
124f0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
12500 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
12510 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
12520 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
12530 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
12540 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
12550 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12560 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
12570 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
12580 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
12590 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
125a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
125b0 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
125c0 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
125d0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
125e0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
125f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
12600 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
12610 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
12620 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
12630 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
12640 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
12650 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
12660 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
12670 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
12680 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
12690 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
126a0 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
126b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
126c0 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
126d0 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
126e0 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
126f0 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
12700 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
12710 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
12720 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
12730 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
12740 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
12750 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
12760 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
12770 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
12780 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
12790 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
127a0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
127b0 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
127c0 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
127d0 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
127e0 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
127f0 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
12800 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
12810 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
12820 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
12830 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
12840 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
12860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
12870 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
12880 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
12890 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
128a0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
128b0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
128c0 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
128d0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
128e0 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
128f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
12900 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
12910 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
12920 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
12930 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
12940 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
12950 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
12960 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
12970 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
12980 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
12990 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
129a0 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
129b0 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
129c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
129d0 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
129e0 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
129f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12a00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12a20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
12a30 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
12a40 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
12a50 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
12a60 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
12a70 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
12a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
12a90 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
12ab0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
12ac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12ad0 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
12ae0 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
12af0 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
12b00 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
12b10 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
12b20 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
12b30 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
12b40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
12b70 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
12b80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
12b90 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
12ba0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
12bb0 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
12bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12bd0 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
12be0 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
12bf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12c00 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
12c10 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
12c20 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
12c30 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
12c40 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b  te3_malloc(nUri+
12c50 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  2);.    if( !zFi
12c60 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
12c70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
12c80 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69  mcpy(zFile, zUri
12c90 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69  , nUri);.    zFi
12ca0 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b  le[nUri] = '\0';
12cb0 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b  .    zFile[nUri+
12cc0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  1] = '\0';.    f
12cd0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
12ce0 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20  OPEN_URI;.  }.. 
12cf0 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65   *ppVfs = sqlite
12d00 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
12d10 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d  ;.  if( *ppVfs==
12d20 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  0 ){.    *pzErrM
12d30 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
12d40 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66  intf("no such vf
12d50 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
12d60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
12d70 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65  RROR;.  }. parse
12d80 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20  _uri_out:.  if( 
12d90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12da0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12db0 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46  e(zFile);.    zF
12dc0 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  ile = 0;.  }.  *
12dd0 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  pFlags = flags;.
12de0 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c    *pzFile = zFil
12df0 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
12e00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
12e10 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
12e20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
12e30 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
12e40 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
12e50 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
12e60 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
12e70 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
12e80 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
12e90 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
12ea0 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
12eb0 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
12ec0 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
12ed0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
12ee0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
12ef0 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
12f00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
12f10 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
12f20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
12f30 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
12f40 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
12f50 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65  flags,    /* Ope
12f60 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
12f70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
12f80 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
12f90 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
12fa0 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
12fb0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12fd0 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  Store allocated 
12fe0 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
12ff0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
13020 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  */.  int isThrea
13030 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20  dsafe;          
13040 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
13050 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e   threadsafe conn
13060 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  ections */.  cha
13070 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20  r *zOpen = 0;   
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13090 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
130a0 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72  t to pass to Btr
130b0 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68  eeOpen() */.  ch
130c0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
130e0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
130f0 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65  rom sqlite3Parse
13100 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44  Uri() */..  *ppD
13110 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
13120 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
13130 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
13140 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
13150 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
13160 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
13170 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
13180 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
13190 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
131a0 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
131b0 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
131c0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
131d0 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
131e0 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
131f0 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
13200 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
13210 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
13220 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
13230 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
13240 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
13250 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
13260 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
13270 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
13280 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
13290 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
132a0 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
132b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
132c0 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
132d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
132e0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
132f0 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
13300 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
13310 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
13320 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
13330 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
13340 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
13350 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
13360 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13370 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
13380 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
13390 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
133a0 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
133b0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
133c0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
133d0 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
133e0 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
133f0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
13400 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
13410 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
13420 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
13430 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
13440 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
13450 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
13460 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
13470 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
13480 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  reMutex==0 ){.  
13490 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
134a0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
134b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
134c0 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
134d0 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
134e0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
134f0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
13500 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29  OPEN_FULLMUTEX )
13510 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
13520 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  fe = 1;.  }else{
13530 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
13540 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e = sqlite3Globa
13550 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
13560 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  ex;.  }.  if( fl
13570 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13580 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29  N_PRIVATECACHE )
13590 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  {.    flags &= ~
135a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
135b0 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65  EDCACHE;.  }else
135c0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
135d0 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
135e0 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
135f0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
13600 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
13610 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  CHE;.  }..  /* R
13620 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
13630 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
13640 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
13650 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
13660 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
13670 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
13680 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
13690 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
136a0 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
136b0 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
136c0 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
136d0 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
136e0 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
136f0 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
13700 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
13710 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
13720 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
13730 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54  READWRITE, SQLIT
13740 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53  E_OPEN_CREATE, S
13750 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13760 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c  DCACHE,.  ** SQL
13770 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
13780 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20  CACHE, and some 
13790 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20  reserved bits.  
137a0 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20  Silently mask.  
137b0 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72  ** off all other
137c0 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66   flags..  */.  f
137d0 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
137e0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
137f0 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
13800 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13810 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
13830 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
13840 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B |.            
13850 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
13860 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  EMP_DB | .      
13870 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
13880 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
13890 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
138a0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
138b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  MAIN_JOURNAL | .
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
138d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
138e0 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
138f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13900 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
13910 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
13920 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
13930 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a  ASTER_JOURNAL |.
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13950 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
13960 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
13970 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
13980 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20  FULLMUTEX |.    
13990 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
139a0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20  E_OPEN_WAL.     
139b0 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
139c0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
139d0 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
139e0 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
139f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13a00 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
13a10 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
13a20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
13a30 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
13a40 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
13a50 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
13a60 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
13a70 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
13a80 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
13a90 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
13aa0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
13ab0 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
13ac0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
13ad0 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
13ae0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
13af0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
13b00 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
13b10 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
13b20 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
13b30 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
13b40 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
13b50 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
13b60 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  atic;..  assert(
13b70 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
13b80 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72  it)==sizeof(aHar
13b90 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d  dLimit) );.  mem
13ba0 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20  cpy(db->aLimit, 
13bb0 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65  aHardLimit, size
13bc0 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b  of(db->aLimit));
13bd0 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
13be0 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
13bf0 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
13c00 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71   db->szMmap = sq
13c10 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
13c20 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e  g.szMmap;.  db->
13c30 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30  nextPagesize = 0
13c40 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
13c50 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
13c60 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45  Names | SQLITE_E
13c70 6e 61 62 6c 65 54 72 69 67 67 65 72 0a 23 69 66  nableTrigger.#if
13c80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13c90 5f 44 45 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49  _DEAULT_AUTOMATI
13ca0 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49  C_INDEX) || SQLI
13cb0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d  TE_DEFAULT_AUTOM
13cc0 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20  ATIC_INDEX.     
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
13ce0 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23  LITE_AutoIndex.#
13cf0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13d00 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f  _DEFAULT_FILE_FO
13d10 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20  RMAT<4.         
13d20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
13d30 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23  _LegacyFileFmt.#
13d40 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
13d50 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f  ITE_ENABLE_LOAD_
13d60 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20  EXTENSION.      
13d70 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
13d80 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
13d90 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  n.#endif.#if SQL
13da0 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55  ITE_DEFAULT_RECU
13db0 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20  RSIVE_TRIGGERS. 
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dd0 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67  | SQLITE_RecTrig
13de0 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20  gers.#endif.#if 
13df0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
13e00 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b  EFAULT_FOREIGN_K
13e10 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44  EYS) && SQLITE_D
13e20 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b  EFAULT_FOREIGN_K
13e30 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  EYS.            
13e40 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f       | SQLITE_Fo
13e50 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66  reignKeys.#endif
13e60 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
13e70 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
13e80 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
13e90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13ea0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
13eb0 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
13ec0 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
13ed0 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
13ee0 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
13ef0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
13f00 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b  ARY. BINARY work
13f10 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38  s for both UTF-8
13f20 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36  .  ** and UTF-16
13f30 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69  , so add a versi
13f40 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61  on for each to a
13f50 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73  void any unneces
13f60 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72  sary.  ** conver
13f70 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  sions. The only 
13f80 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f  error that can o
13f90 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d  ccur here is a m
13fa0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
13fb0 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
13fc0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
13fd0 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
13fe0 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  8, 0, binCollFun
13ff0 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
14000 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
14010 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
14020 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
14030 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
14040 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
14050 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
14060 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69  E_UTF16LE, 0, bi
14070 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
14080 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
14090 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51  (db, "RTRIM", SQ
140a0 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
140b0 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  *)1, binCollFunc
140c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
140d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
140e0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
140f0 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70  out;.  }.  db->p
14100 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  DfltColl = sqlit
14110 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
14120 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22  , SQLITE_UTF8, "
14130 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61  BINARY", 0);.  a
14140 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
14150 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
14160 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d   Also add a UTF-
14170 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  8 case-insensiti
14180 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ve collation seq
14190 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61  uence. */.  crea
141a0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
141b0 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
141c0 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65  _UTF8, 0, nocase
141d0 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
141e0 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  );..  /* Parse t
141f0 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20  he filename/URI 
14200 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64  argument. */.  d
14210 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
14220 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c  lags;.  rc = sql
14230 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66  ite3ParseUri(zVf
14240 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  s, zFilename, &f
14250 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c  lags, &db->pVfs,
14260 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73   &zOpen, &zErrMs
14270 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
14280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
142a0 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63  MEM ) db->malloc
142b0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
142c0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
142d0 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
142e0 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
142f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14300 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
14310 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
14320 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  t;.  }..  /* Ope
14330 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
14340 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
14350 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
14360 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
14370 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
14380 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
14390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
143a0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
143b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
143c0 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
143d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
143e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
143f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
14400 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14410 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
14420 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14430 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  (db, rc, 0);.   
14440 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14450 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b  ;.  }.  db->aDb[
14460 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
14470 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
14480 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
14490 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
144a0 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
144b0 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
144c0 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  );...  /* The de
144d0 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
144e0 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
144f0 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c  database is 'ful
14500 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70  l'; for the temp
14510 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69  .  ** database i
14520 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69  t is 'NONE'. Thi
14530 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
14540 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
14550 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
14560 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[0].zName = 
14570 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44  "main";.  db->aD
14580 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[0].safety_leve
14590 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62  l = 3;.  db->aDb
145a0 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
145b0 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
145c0 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
145d0 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  1;..  db->magic 
145e0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
145f0 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
14600 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14610 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
14620 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
14630 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
14640 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
14650 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
14660 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
14670 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
14680 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
14690 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
146a0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
146b0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
146c0 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
146d0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
146e0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
146f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
14700 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
14710 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ions(db);..  /* 
14720 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
14730 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
14740 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
14750 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
14760 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
14770 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
14780 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
14790 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  I..  */.  rc = s
147a0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
147b0 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  b);.  if( rc==SQ
147c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
147d0 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78  qlite3AutoLoadEx
147e0 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20  tensions(db);.  
147f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
14800 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20  rrcode(db);.    
14810 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14820 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
14830 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
14840 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
14850 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31  LITE_ENABLE_FTS1
14860 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
14870 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14880 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
14890 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74  e3Fts1Init(sqlit
148a0 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
148b0 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64  qlite3Fts1Init(d
148c0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
148d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
148e0 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20  ABLE_FTS2.  if( 
148f0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
14900 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
14910 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  OK ){.    extern
14920 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32   int sqlite3Fts2
14930 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
14940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14950 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts2Init(db);.  
14960 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
14970 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
14980 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS3.  if( !db->m
14990 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
149a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
149b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
149c0 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
149d0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
149e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
149f0 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  CU.  if( !db->ma
14a00 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
14a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14a20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
14a30 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  cuInit(db);.  }.
14a40 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
14a50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52  QLITE_ENABLE_RTR
14a60 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  EE.  if( !db->ma
14a70 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
14a80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
14a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74    rc = sqlite3Rt
14aa0 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  reeInit(db);.  }
14ab0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
14ac0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
14ad0 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  0);..  /* -DSQLI
14ae0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
14af0 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
14b00 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
14b10 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
14b20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
14b30 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
14b40 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
14b50 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
14b60 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
14b70 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
14b80 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
14b90 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
14ba0 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
14bb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
14bc0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
14bd0 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
14be0 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
14bf0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
14c00 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
14c10 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
14c20 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
14c30 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
14c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c50 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
14c60 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
14c70 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
14c80 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65  .  /* Enable the
14c90 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f   lookaside-mallo
14ca0 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20  c subsystem */. 
14cb0 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
14cc0 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c  db, 0, sqlite3Gl
14cd0 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
14ce0 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20  kaside,.        
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14d10 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b  fig.nLookaside);
14d20 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ..  sqlite3_wal_
14d30 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
14d40 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  b, SQLITE_DEFAUL
14d50 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  T_WAL_AUTOCHECKP
14d60 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f  OINT);..opendb_o
14d70 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
14d80 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28  ee(zOpen);.  if(
14d90 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
14da0 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20  t( db->mutex!=0 
14db0 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d  || isThreadsafe=
14dc0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  =0 || sqlite3Glo
14dd0 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
14de0 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
14df0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14e00 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
14e10 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
14e20 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
14e30 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c   assert( db!=0 |
14e40 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
14e50 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  EM );.  if( rc==
14e60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
14e70 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
14e80 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
14e90 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
14ea0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14eb0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
14ec0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
14ed0 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d  K;.  }.  *ppDb =
14ee0 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   db;.#ifdef SQLI
14ef0 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
14f00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
14f10 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
14f20 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  og ){.    /* Ope
14f30 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65  ning a db handle
14f40 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
14f50 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20  er is passed 0. 
14f60 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72  */.    void *pAr
14f70 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  g = sqlite3Globa
14f80 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
14f90 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  rg;.    sqlite3G
14fa0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
14fb0 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46  log(pArg, db, zF
14fc0 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ilename, 0);.  }
14fd0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
14fe0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
14ff0 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  0, rc);.}../*.**
15000 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
15010 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
15020 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
15030 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
15040 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
15050 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
15060 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
15070 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
15080 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
150a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
150b0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
150c0 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
150d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
150e0 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
150f0 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
15100 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
15110 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
15120 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
15130 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15140 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
15150 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
15160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
15170 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
15180 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
15190 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
151a0 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
151b0 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
151c0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
151d0 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
151e0 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
151f0 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
15200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15210 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
15220 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
15230 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
15240 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
15250 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
15260 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
15270 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
15280 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
15290 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
152a0 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
152b0 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
152c0 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
152d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
152e0 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
152f0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
15300 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
15310 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20  ppDb );.  *ppDb 
15320 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
15330 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
15340 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
15350 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
15360 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15370 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56   rc;.#endif.  pV
15380 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
15390 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
153a0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
153b0 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
153c0 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
153d0 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
153e0 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
153f0 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
15400 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
15410 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
15420 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
15430 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
15440 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
15450 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
15460 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
15470 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
15480 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
15490 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
154a0 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
154b0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
154c0 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
154d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
154e0 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
154f0 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
15500 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
15510 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
15520 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
15530 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
15540 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15550 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
15560 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
15570 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
15580 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
15590 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
155a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
155b0 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
155c0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
155d0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
155e0 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
155f0 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
15600 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
15610 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
15620 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
15630 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
15640 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
15650 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
15660 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
15670 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
15680 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
15690 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
156a0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
156b0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
156c0 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
156d0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
156e0 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
156f0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
15700 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
15710 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
15720 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
15730 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
15740 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
15750 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
15760 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
15770 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  c;.}../*.** Regi
15780 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
15790 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
157a0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
157b0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
157c0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
157d0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
157e0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
157f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
15800 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
15810 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
15820 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
15830 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
15840 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
15850 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
15860 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
15870 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
15880 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15890 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
158a0 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
158b0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
158c0 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
158d0 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
158e0 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
158f0 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
15900 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
15910 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
15920 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15930 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
15940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
15950 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15960 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
15970 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
15980 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15990 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
159a0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
159b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
159c0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
159d0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
159e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
159f0 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
15a00 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
15a10 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
15a20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
15a30 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
15a40 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
15a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15a60 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
15a70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15a80 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
15a90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
15aa0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
15ab0 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
15ac0 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
15ad0 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
15ae0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
15af0 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
15b00 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
15b10 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
15b20 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  me8, (u8)enc, pC
15b30 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
15b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
15b50 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b  ree(db, zName8);
15b60 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
15b70 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
15b80 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
15b90 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
15ba0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
15bb0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
15bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
15bd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
15be0 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
15bf0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
15c00 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
15c10 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
15c20 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
15c30 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
15c40 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
15c50 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
15c60 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
15c70 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
15c80 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65  needed(.  sqlite
15c90 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
15ca0 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
15cb0 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
15cc0 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69  eded)(void*,sqli
15cd0 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
15ce0 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  p,const char*).)
15cf0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
15d00 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
15d10 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
15d20 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65  eeded = xCollNee
15d30 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ded;.  db->xColl
15d40 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20  Needed16 = 0;.  
15d50 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
15d60 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
15d70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
15d80 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
15d90 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
15da0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
15db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15dc0 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
15dd0 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
15de0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
15df0 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
15e00 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
15e10 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
15e20 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
15e30 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
15e40 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
15e50 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
15e60 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
15e70 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73  on_needed16(.  s
15e80 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
15e90 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
15ea0 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
15eb0 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69  ollNeeded16)(voi
15ec0 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
15ed0 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76  eTextRep,const v
15ee0 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74  oid*).){.  sqlit
15ef0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
15f00 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
15f10 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30  >xCollNeeded = 0
15f20 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
15f30 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65  ded16 = xCollNee
15f40 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f  ded16;.  db->pCo
15f50 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
15f60 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
15f70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15f80 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
15f90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15fa0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
15fb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
15fc0 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
15fd0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
15fe0 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
15ff0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
16000 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20  an anachronism. 
16010 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73  It used to be us
16020 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ed to recover fr
16030 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  om a.** malloc()
16040 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51   failure, but SQ
16050 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68  Lite now does th
16060 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
16070 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16080 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
16090 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
160a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
160b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
160c0 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
160d0 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  r not the databa
160e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
160f0 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a   in autocommit.*
16100 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  * mode.  Return 
16110 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e  TRUE if it is an
16120 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20  d FALSE if not. 
16130 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   Autocommit mode
16140 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66   is on.** by def
16150 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69  ault.  Autocommi
16160 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79  t is disabled by
16170 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
16180 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64  nt and reenabled
16190 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20  .** by the next 
161a0 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
161b0 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
161c0 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
161d0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
161e0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
161f0 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
16200 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
16210 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
16220 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
16230 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
16240 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
16250 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
16260 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
16270 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
16280 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
16290 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
162a0 65 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75  ey server two pu
162b0 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
162c0 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
162d0 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
162e0 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
162f0 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
16300 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
16310 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
16320 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
16330 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
16340 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
16350 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
16360 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
16370 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
16380 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
16390 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
163a0 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
163b0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
163c0 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
163d0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
163e0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
163f0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
16400 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
16410 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
16420 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
16430 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
16440 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
16450 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
16470 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
16480 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
16490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
164a0 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
164b0 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
164c0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
164d0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
164e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
164f0 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
16500 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
16510 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
16520 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
16530 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
16540 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
16550 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
16560 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
16570 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16580 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
16590 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
165a0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
165b0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
165c0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
165d0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
165e0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
165f0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
16600 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
16610 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
16620 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
16630 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
16640 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
16650 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
16660 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16670 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
16680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16690 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
166a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
166b0 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
166c0 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
166d0 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
166e0 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
166f0 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
16700 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
16710 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
16720 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
16730 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
16740 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
16750 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
16760 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
16770 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
16780 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
16790 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
167a0 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
167b0 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
167c0 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
167d0 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
167e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
167f0 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
16800 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
16810 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
16820 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
16830 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
16840 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
16850 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
16860 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
16870 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74  TADATA.int sqlit
16880 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
16890 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
168a0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
168b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
168c0 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
168d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
168e0 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
168f0 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
16900 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
16910 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
16920 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
16930 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
16940 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
16950 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
16960 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
16970 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
16980 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
16990 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
169a0 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
169b0 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
169c0 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
169d0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
169e0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
169f0 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
16a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16a10 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
16a20 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
16a30 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
16a40 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
16a50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
16a60 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
16a70 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
16a80 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16aa0 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
16ab0 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
16ac0 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
16ad0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
16ae0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
16af0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
16b00 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
16b10 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
16b20 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  l;..  char const
16b30 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
16b40 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
16b50 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
16b60 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
16b70 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
16b80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
16b90 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
16ba0 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
16bb0 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
16bc0 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
16bd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16be0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
16bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16c00 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
16c10 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
16c20 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
16c30 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
16c40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
16c50 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
16c60 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
16c70 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
16c80 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
16c90 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
16ca0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
16cb0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
16cc0 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
16cd0 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
16ce0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
16cf0 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
16d00 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
16d10 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
16d20 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
16d30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
16d40 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
16d50 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
16d60 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
16d70 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
16d80 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
16d90 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
16da0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
16db0 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
16dc0 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
16dd0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
16de0 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
16df0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
16e00 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
16e10 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
16e20 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
16e30 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
16e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16e50 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
16e60 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
16e70 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
16e80 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
16e90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16ea0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
16eb0 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
16ec0 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
16ed0 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
16ee0 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
16ef0 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
16f00 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
16f10 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
16f20 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
16f30 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
16f40 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
16f50 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
16f60 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
16f70 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
16f80 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
16f90 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
16fa0 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
16fb0 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
16fc0 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
16fd0 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
16fe0 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
16ff0 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
17000 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
17010 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
17020 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
17030 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
17040 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
17050 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
17060 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
17070 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
17080 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
17090 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
170a0 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
170b0 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
170c0 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
170d0 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
170e0 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
170f0 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
17100 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
17110 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  = (pCol->colFlag
17120 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
17130 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74  KEY)!=0;.    aut
17140 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
17150 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
17160 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
17170 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
17180 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
17190 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
171a0 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
171b0 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
171c0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
171d0 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
171e0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
171f0 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
17200 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
17210 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
17220 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
17230 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
17240 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
17250 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
17260 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
17270 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
17280 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
17290 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
172a0 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
172b0 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
172c0 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
172d0 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
172e0 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
172f0 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
17300 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
17310 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
17320 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
17330 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
17340 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
17350 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
17360 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
17370 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
17380 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
17390 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
173a0 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
173b0 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
173c0 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
173d0 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
173e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
173f0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
17400 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
17410 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
17420 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
17430 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
17440 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
17450 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
17460 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
17470 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
17480 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
17490 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
174a0 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
174b0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
174c0 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
174d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
174e0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
174f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17500 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
17510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17520 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c  #endif../*.** Sl
17530 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
17540 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
17550 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
17560 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
17570 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69   sqlite3_sleep(i
17580 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65  nt ms){.  sqlite
17590 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69  3_vfs *pVfs;.  i
175a0 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20  nt rc;.  pVfs = 
175b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
175c0 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d  (0);.  if( pVfs=
175d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
175e0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
175f0 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c  on works in mill
17600 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68  iseconds, but th
17610 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53  e underlying OsS
17620 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49  leep() .  ** API
17630 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e   uses microsecon
17640 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30  ds. Hence the 10
17650 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  00's..  */.  rc 
17660 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  = (sqlite3OsSlee
17670 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29  p(pVfs, 1000*ms)
17680 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
17690 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
176a0 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
176b0 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73  the extended res
176c0 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e  ult codes..*/.in
176d0 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
176e0 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
176f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
17700 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74   onoff){.  sqlit
17710 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
17720 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
17730 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66  >errMask = onoff
17740 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
17750 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0xff;.  sqlite3_
17760 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
17770 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
17780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17790 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
177a0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74  xFileControl met
177b0 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75  hod on a particu
177c0 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lar database..*/
177d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c  .int sqlite3_fil
177e0 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  e_control(sqlite
177f0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
17800 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20  r *zDbName, int 
17810 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
17820 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17830 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65  TE_ERROR;.  Btre
17840 65 20 2a 70 42 74 72 65 65 3b 0a 0a 20 20 73 71  e *pBtree;..  sq
17850 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17860 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
17870 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33  pBtree = sqlite3
17880 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
17890 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
178a0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
178b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
178c0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
178d0 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *fd;.    sqlite3
178e0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
178f0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
17900 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
17910 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
17920 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
17930 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71  0 );.    fd = sq
17940 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
17950 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
17960 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20  rt( fd!=0 );.   
17970 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
17980 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
17990 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71  ER ){.      *(sq
179a0 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72  lite3_file**)pAr
179b0 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63  g = fd;.      rc
179c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
179d0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e    }else if( fd->
179e0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
179f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17a00 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
17a10 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  op, pArg);.    }
17a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
17a30 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
17a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17a50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
17a60 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tree);.  }.  sql
17a70 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
17a80 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
17a90 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a  eturn rc;   .}..
17aa0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  /*.** Interface 
17ab0 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c  to the testing l
17ac0 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ogic..*/.int sql
17ad0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
17ae0 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  l(int op, ...){.
17af0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
17b00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17b10 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20  T_BUILTIN_TEST. 
17b20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
17b30 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
17b40 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
17b50 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
17b60 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
17b70 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
17b80 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  NG..    */.    c
17b90 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
17ba0 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b  TRL_PRNG_SAVE: {
17bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
17bc0 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20  ngSaveState();. 
17bd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17be0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
17bf0 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61   Restore the sta
17c00 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74  te of the PRNG t
17c10 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65  o the last state
17c20 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20   saved using.   
17c30 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20   ** PRNG_SAVE.  
17c40 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73  If PRNG_SAVE has
17c50 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
17c60 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a  en called, then.
17c70 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62      ** this verb
17c80 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f   acts like PRNG_
17c90 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  RESET..    */.  
17ca0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
17cb0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
17cc0 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
17cd0 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53  ite3PrngRestoreS
17ce0 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
17cf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
17d00 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20  /*.    ** Reset 
17d10 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f  the PRNG back to
17d20 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a   its uninitializ
17d30 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e  ed state.  The n
17d40 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ext call.    ** 
17d50 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  to sqlite3_rando
17d60 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73  mness() will res
17d70 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69  eed the PRNG usi
17d80 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  ng a single call
17d90 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  .    ** to the x
17da0 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f  Randomness metho
17db0 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  d of the default
17dc0 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   VFS..    */.   
17dd0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
17de0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
17df0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
17e00 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65 28  3PrngResetState(
17e10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17e20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
17e30 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
17e40 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45  st_control(BITVE
17e50 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72  C_TEST, size, pr
17e60 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20  ogram).    **.  
17e70 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20    ** Run a test 
17e80 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63  against a Bitvec
17e90 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e   object of size.
17ea0 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72    The program ar
17eb0 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73  gument.    ** is
17ec0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
17ed0 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e  egers that defin
17ee0 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65  es the test.  Re
17ef0 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20  turn -1 on a.   
17f00 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
17f10 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f  ation error, 0 o
17f20 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f  n success, or no
17f30 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72  n-zero for an er
17f40 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  ror..    ** See 
17f50 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65  the sqlite3Bitve
17f60 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66  cBuiltinTest() f
17f70 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
17f80 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
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 42 49 54 56 45  E_TESTCTRL_BITVE
17fb0 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20  C_TEST: {.      
17fc0 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
17fd0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
17fe0 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f  int *aProg = va_
17ff0 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
18000 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18010 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
18020 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20  st(sz, aProg);. 
18030 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18040 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
18050 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
18060 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
18070 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
18080 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
18090 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
180a0 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
180b0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
180c0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
180d0 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
180e0 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
180f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
18100 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
18110 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
18120 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
18130 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
18140 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
18150 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
18160 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
18170 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
18180 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
18190 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
181a0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
181b0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
181c0 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
181d0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
181e0 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
181f0 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
18200 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
18210 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
18220 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18230 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
18240 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
18250 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
18260 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
18270 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
18280 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
18290 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
182a0 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
182b0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
182c0 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
182d0 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
182e0 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
182f0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
18300 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
18310 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
18320 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
18330 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
18340 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
18350 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
18360 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
18370 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
18380 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
18390 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
183a0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
183b0 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
183c0 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
183d0 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
183e0 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
183f0 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
18400 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
18410 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
18420 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
18430 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65  * dileterious be
18440 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
18450 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18460 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
18470 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63  BYTE: {.      rc
18480 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
18490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
184a0 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b  OMIT_WSD.      {
184b0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
184c0 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
184d0 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
184e0 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
184f0 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71   if( newVal ) sq
18500 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65  lite3PendingByte
18510 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
18520 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
18530 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
18540 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
18550 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
18560 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
18570 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29  L_ASSERT, int X)
18580 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18590 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
185a0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
185b0 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
185c0 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a  er or not.    **
185d0 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e   assert() was en
185e0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
185f0 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20  -time.  If X is 
18600 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28  true and assert(
18610 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62  ).    ** is enab
18620 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
18630 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72  turn value is tr
18640 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  ue.  If X is tru
18650 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73  e and.    ** ass
18660 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
18670 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
18680 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
18690 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a  .  If X is.    *
186a0 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  * false and asse
186b0 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c  rt() is enabled,
186c0 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74   then the assert
186d0 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68  ion fires and th
186e0 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
186f0 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69   aborts.  If X i
18700 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  s false and asse
18710 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
18720 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
18730 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
18740 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  s zero..    */. 
18750 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18760 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
18770 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65  {.      volatile
18780 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
18790 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20 76    assert( (x = v
187a0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d  a_arg(ap,int))!=
187b0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
187c0 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
187d0 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20      }...    /*. 
187e0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
187f0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
18800 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
18810 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  YS, int X).    *
18820 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
18830 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
18840 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
18850 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57   see how the ALW
18860 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e  AYS and.    ** N
18870 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65  EVER macros were
18880 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70   defined at comp
18890 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a  ile-time..    **
188a0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75  .    ** The retu
188b0 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41  rn value is ALWA
188c0 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a  YS(X).  .    **.
188d0 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d      ** The recom
188e0 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58  mended test is X
188f0 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74  ==2.  If the ret
18900 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20  urn value is 2, 
18910 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  that means.    *
18920 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  * ALWAYS() and N
18930 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20  EVER() are both 
18940 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
18950 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68  gh macros, which
18960 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   is the.    ** d
18970 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20  efault setting. 
18980 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
18990 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20  alue is 1, then 
189a0 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68  ALWAYS() is eith
189b0 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63  er.    ** hard-c
189c0 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20  oded to true or 
189d0 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20  else it asserts 
189e0 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  if its argument 
189f0 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
18a00 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76   The first behav
18a10 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20  ior (hard-coded 
18a20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20  to true) is the 
18a30 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
18a40 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
18a50 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
18a60 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
18a70 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65  abled and the se
18a80 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61  cond.    ** beha
18a90 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20  vior (assert if 
18aa0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
18ab0 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73  ALWAYS() is fals
18ac0 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
18ad0 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
18ae0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
18af0 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
18b00 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  t() is enabled..
18b10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
18b20 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  e run-time test 
18b30 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20  procedure might 
18b40 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
18b50 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
18b60 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73  .    **    if( s
18b70 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
18b80 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
18b90 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d  TRL_ALWAYS, 2)==
18ba0 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  2 ){.    **     
18bb0 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64   // ALWAYS() and
18bc0 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d   NEVER() are no-
18bd0 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
18be0 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20  macros.    **   
18bf0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
18c00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
18c10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
18c20 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20  ASSERT, 1) ){.  
18c30 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
18c40 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74  AYS(x) asserts t
18c50 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e  hat x is true. N
18c60 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20  EVER(x) asserts 
18c70 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  x is false..    
18c80 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  **    }else{.   
18c90 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
18ca0 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  YS(x) is a const
18cb0 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29  ant 1.  NEVER(x)
18cc0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30   is a constant 0
18cd0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20  ..    **    }.  
18ce0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
18cf0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
18d00 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WAYS: {.      in
18d10 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
18d20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
18d30 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20   ALWAYS(x);.    
18d40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
18d50 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
18d60 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
18d70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
18d80 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a  SERVE, sqlite3 *
18d90 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
18da0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
18db0 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74   nReserve size t
18dc0 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  o N for the main
18dd0 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65   database on the
18de0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
18df0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
18e00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
18e10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
18e20 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20  RESERVE: {.     
18e30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
18e40 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
18e50 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
18e60 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
18e70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18e80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
18e90 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
18ea0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
18eb0 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  geSize(db->aDb[0
18ec0 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b  ].pBt, 0, x, 0);
18ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
18ee0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
18ef0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
18f00 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18f10 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
18f20 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
18f30 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
18f40 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a  TIONS, sqlite3 *
18f50 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
18f60 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
18f70 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f  or disable vario
18f80 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
18f90 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
18fa0 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20  poses.  The .   
18fb0 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69   ** argument N i
18fc0 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
18fd0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
18fe0 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f  be disabled.  Fo
18ff0 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20  r normal.    ** 
19000 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75  operation N shou
19010 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64  ld be 0.  The id
19020 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73  ea is that a tes
19030 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20  t program (like 
19040 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c  the.    ** SQL L
19050 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54  ogic Test or SLT
19060 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61   test module) ca
19070 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53  n run the same S
19080 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  QL multiple time
19090 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61  s.    ** with va
190a0 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
190b0 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20  ons disabled to 
190c0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
190d0 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20  same answer.    
190e0 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ** is obtained i
190f0 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20  n every case..  
19100 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
19110 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
19120 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20  TIMIZATIONS: {. 
19130 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
19140 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
19150 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64  lite3*);.      d
19160 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20  b->dbOptFlags = 
19170 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c  (u16)(va_arg(ap,
19180 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b   int) & 0xffff);
19190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
191a0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
191b0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
191c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
191d0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
191e0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
191f0 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
19200 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
19210 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
19220 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
19230 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
19240 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
19250 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
19260 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
19270 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
19280 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
19290 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
192a0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
192b0 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
192c0 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
192d0 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
192e0 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
192f0 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
19300 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
19310 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
19320 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
19330 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
19340 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
19350 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
19360 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
19370 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
19380 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
19390 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
193a0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
193b0 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
193c0 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
193d0 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
193e0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
193f0 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
19400 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
19410 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
19420 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
19430 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19440 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f  }.#endif ..    /
19450 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
19460 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19470 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
19480 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c  LLOC, sz, &pNew,
19490 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a   pFree);.    **.
194a0 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65      ** Pass pFre
194b0 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63  e into sqlite3Sc
194c0 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20  ratchFree(). .  
194d0 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65    ** If sz>0 the
194e0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72  n allocate a scr
194f0 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f  atch buffer into
19500 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a   pNew.  .    */.
19510 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19520 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
19530 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
19540 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70  void *pFree, **p
19550 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20  pNew;.      int 
19560 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76  sz;.      sz = v
19570 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
19580 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61        ppNew = va
19590 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29  _arg(ap, void**)
195a0 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20  ;.      pFree = 
195b0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
195c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20  );.      if( sz 
195d0 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74  ) *ppNew = sqlit
195e0 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
195f0 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sz);.      sqlit
19600 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46  e3ScratchFree(pF
19610 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ree);.      brea
19620 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
19630 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
19640 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
19650 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
19660 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f  E_FAULT, int ono
19670 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ff);.    **.    
19680 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
19690 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72  onoff is non-zer
196a0 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  o, configure the
196b0 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61   wrappers so tha
196c0 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62  t all.    ** sub
196d0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
196e0 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64   localtime() and
196f0 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20   variants fail. 
19700 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f  If onoff is zero
19710 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68  ,.    ** undo th
19720 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20  is setting..    
19730 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
19740 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
19750 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20  LTIME_FAULT: {. 
19760 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
19770 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74  alConfig.bLocalt
19780 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72  imeFault = va_ar
19790 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
197a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
197b0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
197c0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
197d0 58 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20  XPLAIN).    /*  
197e0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
197f0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
19800 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54  TCTRL_EXPLAIN_ST
19810 4d 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  MT,.    **      
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c    sqlite3_stmt*,
19840 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20  const char**);. 
19850 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
19860 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
19870 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
19880 5f 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73  _EXPLAIN, each s
19890 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64  qlite3_stmt hold
198a0 73 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e  s.    ** a strin
198b0 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
198c0 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70   the optimized p
198d0 61 72 73 65 20 74 72 65 65 2e 20 20 54 68 69 73  arse tree.  This
198e0 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20   test-control.  
198f0 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70    ** returns a p
19900 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73  ointer to that s
19910 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tring..    */.  
19920 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19930 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53  STCTRL_EXPLAIN_S
19940 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TMT: {.      sql
19950 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19960 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
19970 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20  lite3_stmt*);.  
19980 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19990 2a 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28  *pzRet = va_arg(
199a0 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a  ap, const char**
199b0 29 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20  );.      *pzRet 
199c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
199d0 6c 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29  lanation((Vdbe*)
199e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72  pStmt);.      br
199f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
19a00 66 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  f..  }.  va_end(
19a10 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ap);.#endif /* S
19a20 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54  QLITE_OMIT_BUILT
19a30 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74  IN_TEST */.  ret
19a40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19a50 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
19a60 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66  ty routine, usef
19a70 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d  ul to VFS implem
19a80 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20  entations, that 
19a90 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65  checks.** to see
19aa0 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
19ab0 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68  ile was a URI th
19ac0 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73  at contained a s
19ad0 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a  pecific query .*
19ae0 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64  * parameter, and
19af0 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74   if so obtains t
19b00 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
19b10 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
19b20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
19b30 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
19b40 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f   the filename po
19b50 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74  inter passed int
19b60 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a  o the xOpen().**
19b70 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53   method of a VFS
19b80 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
19b90 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67    The zParam arg
19ba0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
19bb0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72  e of the.** quer
19bc0 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73  y parameter we s
19bd0 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eek.  This routi
19be0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  ne returns the v
19bf0 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72  alue of the zPar
19c00 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  am.** parameter 
19c10 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49  if it exists.  I
19c20 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
19c30 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
19c40 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
19c50 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70  returns a NULL p
19c60 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74  ointer..*/.const
19c70 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75   char *sqlite3_u
19c80 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e  ri_parameter(con
19c90 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
19ca0 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
19cb0 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a  zParam){.  if( z
19cc0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65  Filename==0 ) re
19cd0 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e  turn 0;.  zFilen
19ce0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
19cf0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
19d00 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  ) + 1;.  while( 
19d10 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
19d20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63      int x = strc
19d30 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  mp(zFilename, zP
19d40 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65  aram);.    zFile
19d50 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
19d60 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
19d70 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  e) + 1;.    if( 
19d80 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46  x==0 ) return zF
19d90 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69  ilename;.    zFi
19da0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
19db0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
19dc0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  ame) + 1;.  }.  
19dd0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
19de0 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c  ** Return a bool
19df0 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ean value for a 
19e00 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
19e10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
19e20 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73  uri_boolean(cons
19e30 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
19e40 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
19e50 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74  Param, int bDflt
19e60 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
19e70 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
19e80 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
19e90 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
19ea0 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d   bDflt = bDflt!=
19eb0 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20  0;.  return z ? 
19ec0 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
19ed0 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44  n(z, bDflt) : bD
19ee0 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
19ef0 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e  turn a 64-bit in
19f00 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
19f10 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
19f20 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  r..*/.sqlite3_in
19f30 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  t64 sqlite3_uri_
19f40 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63  int64(.  const c
19f50 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
19f60 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
19f70 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65  s passed to xOpe
19f80 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
19f90 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20  r *zParam,      
19fa0 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65   /* URI paramete
19fb0 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71  r sought */.  sq
19fc0 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c  lite3_int64 bDfl
19fd0 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  t       /* retur
19fe0 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69  n if parameter i
19ff0 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a  s missing */.){.
1a000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1a010 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
1a020 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
1a030 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71  e, zParam);.  sq
1a040 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
1a050 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65   if( z && sqlite
1a060 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20 73  3Atoi64(z, &v, s
1a070 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1a080 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3d  ), SQLITE_UTF8)=
1a090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a0a0 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d    bDflt = v;.  }
1a0b0 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b  .  return bDflt;
1a0c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a0d0 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74   the Btree point
1a0e0 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  er identified by
1a0f0 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72   zDbName.  Retur
1a100 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
1a110 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73  und..*/.Btree *s
1a120 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1a130 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
1a140 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a150 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1a160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1a170 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1a180 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
1a190 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e  Bt.     && (zDbN
1a1a0 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
1a1b0 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65  3StrICmp(zDbName
1a1c0 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  , db->aDb[i].zNa
1a1d0 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20  me)==0).    ){. 
1a1e0 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e       return db->
1a1f0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
1a200 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1a210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a220 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f  n the filename o
1a230 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1a240 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1a250 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1a260 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  nection..*/.cons
1a270 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
1a280 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69  db_filename(sqli
1a290 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1a2a0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1a2b0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71   Btree *pBt = sq
1a2c0 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1a2d0 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1a2e0 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
1a2f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
1a300 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30  ilename(pBt) : 0
1a310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a320 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20  n 1 if database 
1a330 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  is read-only or 
1a340 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e  0 if read/write.
1a350 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a    Return -1 if.*
1a360 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61  * no such databa
1a370 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e  se exists..*/.in
1a380 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61  t sqlite3_db_rea
1a390 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64  donly(sqlite3 *d
1a3a0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1a3b0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1a3c0 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44   *pBt = sqlite3D
1a3d0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1a3e0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
1a3f0 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
1a400 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
1a410 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1a420 65 72 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a 7d  er(pBt)) : -1;.}
1a430 0a                                               .