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

Artifact 9600da7dae7ede8999fdd8a59cb55f7abe6809ed:


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: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
12a0: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
12b0: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
12c0: 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  d.  If unable to
12d0: 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a   .  ** initializ
12e0: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
12f0: 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61  ystem, return ea
1300: 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72 72  rly with the err
1310: 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  or..  ** If the 
1320: 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63  system is so sic
1330: 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75 6e  k that we are un
1340: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
1350: 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74   a mutex,.  ** t
1360: 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68  here is not much
1370: 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67   SQLite is going
1380: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64   to be able to d
1390: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
13a0: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
13b0: 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65 20   must take care 
13c0: 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69  of serializing i
13d0: 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74  ts own.  ** init
13e0: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
13f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d  .  rc = sqlite3M
1400: 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66  utexInit();.  if
1410: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1420: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1430: 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20  ze the malloc() 
1440: 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72  system and the r
1450: 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75  ecursive pInitMu
1460: 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20  tex mutex..  ** 
1470: 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  This operation i
1480: 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  s protected by t
1490: 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52  he STATIC_MASTER
14a0: 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68   mutex.  Note th
14b0: 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c  at.  ** MutexAll
14c0: 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  oc() is called f
14d0: 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74 65  or a static mute
14e0: 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69  x prior to initi
14f0: 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a  alizing the.  **
1500: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1510: 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73  m - this implies
1520: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
1530: 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63  tion of a static
1540: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74  .  ** mutex must
1550: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75 70   not require sup
1560: 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61  port from the ma
1570: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a  lloc subsystem..
1580: 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47    */.  MUTEX_LOG
1590: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
15a0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15b0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15c0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
15d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15e0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
15f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1600: 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74  nfig.isMutexInit
1610: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c   = 1;.  if( !sql
1620: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1630: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
1640: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1650: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20  3MallocInit();. 
1660: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1670: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1680: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1690: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
16a0: 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   1;.    if( !sql
16b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16c0: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
16d0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
16e0: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
16f0: 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tex =.          
1700: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1710: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1720: 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
1730: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1740: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
1750: 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65 33  utex && !sqlite3
1760: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1770: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
1780: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1790: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
17a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
17b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
17d0: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
17e0: 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  utex++;.  }.  sq
17f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1800: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
1810: 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53  * If rc is not S
1820: 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73  QLITE_OK at this
1830: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74   point, then eit
1840: 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20  her the malloc. 
1850: 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f   ** subsystem co
1860: 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69  uld not be initi
1870: 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79  alized or the sy
1880: 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61  stem failed to a
1890: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65  llocate.  ** the
18a0: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
18b0: 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  x. Return an err
18c0: 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  or in either cas
18d0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  e.  */.  if( rc!
18e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1900: 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65  ..  /* Do the re
1910: 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  st of the initia
1920: 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74  lization under t
1930: 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  he recursive mut
1940: 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ex so.  ** that 
1950: 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  we will be able 
1960: 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73  to handle recurs
1970: 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20  ive calls into. 
1980: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   ** sqlite3_init
1990: 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72  ialize().  The r
19a0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e  ecursive calls n
19b0: 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72  ormally come thr
19c0: 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ough.  ** sqlite
19d0: 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e  3_os_init() when
19e0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69   it invokes sqli
19f0: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1a00: 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20  (), but other.  
1a10: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  ** recursive cal
1a20: 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  ls might also be
1a30: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a   possible..  **.
1a40: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
1a50: 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d  ION-OF: R-00140-
1a60: 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75 74  37445 SQLite aut
1a70: 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61  omatically seria
1a80: 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a  lizes calls.  **
1a90: 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65   to the xInit me
1aa0: 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e  thod, so the xIn
1ab0: 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e  it method need n
1ac0: 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66 65  ot be threadsafe
1ad0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1ae0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20  following mutex 
1af0: 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a  is what serializ
1b00: 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  es access to the
1b10: 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20 78   appdef pcache x
1b20: 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64  Init.  ** method
1b30: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
1b40: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78  pcache_methods.x
1b50: 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d  Init() all is em
1b60: 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20  bedded in the.  
1b70: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
1b80: 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69  e3PcacheInitiali
1b90: 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ze()..  */.  sql
1ba0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1bb0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1bc0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1bd0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
1be0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1bf0: 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  it==0 && sqlite3
1c00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1c10: 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20  rogress==0 ){.  
1c20: 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70    FuncDefHash *p
1c30: 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46  Hash = &GLOBAL(F
1c40: 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69  uncDefHash, sqli
1c50: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1c60: 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ns);.    sqlite3
1c70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1c80: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
1c90: 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30   memset(pHash, 0
1ca0: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
1cb0: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29  GlobalFunctions)
1cc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1cd0: 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63  gisterGlobalFunc
1ce0: 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28  tions();.    if(
1cf0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d00: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
1d10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
1d20: 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1d30: 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  Initialize();.  
1d40: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1d50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1d70: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1d80: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  nit = 1;.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69  c = sqlite3OsIni
1da0: 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t();.    }.    i
1db0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1dd0: 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65 74  3PCacheBufferSet
1de0: 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  up( sqlite3Globa
1df0: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a  lConfig.pPage, .
1e00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
1e20: 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Page, sqlite3Glo
1e30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29  balConfig.nPage)
1e40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1e50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1e60: 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
1e70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1e80: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1e90: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1ea0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1eb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ec0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
1ed0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
1ee0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
1ef0: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
1f00: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
1f10: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
1f20: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
1f30: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
1f40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f50: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1f60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f70: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1f80: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
1f90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1fa0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
1fb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
1fc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fd0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
1fe0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1ff0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2000: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2010: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2020: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2030: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2040: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2050: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2060: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2070: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2080: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
2090: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
20a0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
20b0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
20c0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
20d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
20e0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
20f0: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2100: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2110: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2120: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2130: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2140: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2150: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2160: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2170: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2180: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
2190: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
21a0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
21b0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
21c0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
21d0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
21e0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
21f0: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2200: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2210: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2220: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2240: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2250: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2260: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2270: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2280: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
2290: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
22a0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
22b0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
22c0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
22d0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
22e0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
22f0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2300: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2310: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2320: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2330: 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d 3d 53  INIT.  if( rc==S
2340: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
2350: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2360: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e  isInit ){.    in
2370: 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  t SQLITE_EXTRA_I
2380: 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  NIT(const char*)
2390: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
23a0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b  E_EXTRA_INIT(0);
23b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23d0: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65  ** Undo the effe
23e0: 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  cts of sqlite3_i
23f0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75  nitialize().  Mu
2400: 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  st not be called
2410: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20   while.** there 
2420: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
2430: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2440: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2450: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a  llocations or.**
2460: 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20   while any part 
2470: 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68  of SQLite is oth
2480: 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e  erwise in use in
2490: 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68   any thread.  Th
24a0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
24b0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
24c0: 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65    But it is safe
24d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20   to invoke this 
24e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68  routine.** on wh
24f0: 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  en SQLite is alr
2500: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20  eady shut down. 
2510: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
2520: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a  ready shut down.
2530: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2540: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tine is invoked,
2550: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2560: 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
2570: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
2580: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
2590: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c  void){.  if( sql
25a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
25b0: 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65  .isInit ){.#ifde
25c0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53  f SQLITE_EXTRA_S
25d0: 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64  HUTDOWN.    void
25e0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
25f0: 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20  UTDOWN(void);.  
2600: 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53    SQLITE_EXTRA_S
2610: 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69  HUTDOWN();.#endi
2620: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73  f.    sqlite3_os
2630: 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  _end();.    sqli
2640: 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65  te3_reset_auto_e
2650: 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20  xtension();.    
2660: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2670: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
2680: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
2690: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
26a0: 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20  PCacheInit ){.  
26b0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
26c0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73  hutdown();.    s
26d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
26e0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
26f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2700: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2710: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2720: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
2730: 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73  llocEnd();.    s
2740: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2750: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2760: 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2770: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f  LITE_OMIT_SHUTDO
2780: 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20  WN_DIRECTORIES. 
2790: 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73     /* The heap s
27a0: 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77  ubsystem has now
27b0: 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61   been shutdown a
27c0: 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  nd these values 
27d0: 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20  are supposed.   
27e0: 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f   ** to be NULL o
27f0: 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72  r point to memor
2800: 79 20 74 68 61 74 20 77 61 73 20 6f 62 74 61 69  y that was obtai
2810: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2820: 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a  _malloc(),.    *
2830: 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65  * which would re
2840: 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20  ly on that heap 
2850: 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65  subsystem; there
2860: 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  fore, make sure 
2870: 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c  these.    ** val
2880: 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72  ues cannot refer
2890: 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20   to heap memory 
28a0: 74 68 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e  that was just in
28b0: 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74  validated when t
28c0: 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73  he.    ** heap s
28d0: 75 62 73 79 73 74 65 6d 20 77 61 73 20 73 68 75  ubsystem was shu
28e0: 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20  tdown.  This is 
28f0: 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65  only done if the
2900: 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f   current call to
2910: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
2920: 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69  ction resulted i
2930: 6e 20 74 68 65 20 68 65 61 70 20 73 75 62 73 79  n the heap subsy
2940: 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65  stem actually be
2950: 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20  ing shutdown..  
2960: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2970: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2980: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2990: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
29a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
29b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
29c0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
29d0: 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  xInit ){.    sql
29e0: 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a  ite3MutexEnd();.
29f0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2a00: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2a10: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nit = 0;.  }..  
2a20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a40: 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69  API allows appli
2a50: 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66  cations to modif
2a60: 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e  y the global con
2a70: 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a  figuration of.**
2a80: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
2a90: 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ary at run-time.
2aa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ab0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2ac0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
2ad0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
2ae0: 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62  tanding.** datab
2af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
2b00: 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  or memory alloca
2b10: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75  tions.  This rou
2b20: 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74  tine is not.** t
2b30: 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c  hreadsafe.  Fail
2b40: 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65 73  ure to heed thes
2b50: 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c  e warnings can l
2b60: 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74  ead to unpredict
2b70: 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72  able.** behavior
2b80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b90: 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20  _config(int op, 
2ba0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2bb0: 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ap;.  int rc = S
2bc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2bd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
2be0: 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51   shall return SQ
2bf0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69  LITE_MISUSE if i
2c00: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69  t is invoked whi
2c10: 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69  le.  ** the SQLi
2c20: 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e  te library is in
2c30: 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73   use. */.  if( s
2c40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c50: 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75  ig.isInit ) retu
2c60: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
2c70: 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61  _BKPT;..  va_sta
2c80: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
2c90: 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
2ca0: 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67   /* Mutex config
2cb0: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
2cc0: 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  are only availab
2cd0: 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73 61  le in a threadsa
2ce0: 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  fe.    ** compil
2cf0: 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64  e. .    */.#if d
2d00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
2d10: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
2d20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
2d30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d40: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
2d50: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2d60: 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74   Disable all mut
2d70: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
2d80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2d90: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
2da0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
2db0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
2dc0: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  llMutex = 0;.   
2dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2df0: 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45  CONFIG_MULTITHRE
2e00: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e10: 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  isable mutexing 
2e20: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  of database conn
2e30: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  ections */.     
2e40: 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78   /* Enable mutex
2e50: 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61  ing of core data
2e60: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
2e70: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e80: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
2e90: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  tex = 1;.      s
2ea0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2eb0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
2ec0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2ed0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2ee0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52  QLITE_CONFIG_SER
2ef0: 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  IALIZED: {.     
2f00: 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d   /* Enable all m
2f10: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2f20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f30: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f40: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f60: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20  FullMutex = 1;. 
2f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f80: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f90: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20  E_CONFIG_MUTEX: 
2fa0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2fb0: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2fc0: 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  e mutex implemen
2fd0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2fe0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ff0: 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f  fig.mutex = *va_
3000: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3010: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b  mutex_methods*);
3020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3030: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3040: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55  ITE_CONFIG_GETMU
3050: 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TEX: {.      /* 
3060: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
3070: 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65  rent mutex imple
3080: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
3090: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
30a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
30b0: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
30c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
30d0: 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ex;.      break;
30e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .    }.#endif...
30f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3100: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b  CONFIG_MALLOC: {
3110: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
3120: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
3130: 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e   malloc implemen
3140: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3150: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3160: 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28  fig.m = *va_arg(
3170: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
3180: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
3190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
31b0: 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20  NFIG_GETMALLOC: 
31c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69  {.      /* Retri
31d0: 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  eve the current 
31e0: 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65  malloc() impleme
31f0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3200: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3210: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
3220: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
3230: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
3240: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3250: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3260: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
3270: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
3280: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3290: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
32a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
32b0: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
32c0: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
32d0: 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74  le the malloc st
32e0: 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  atus collection 
32f0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3300: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3310: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3320: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3340: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3350: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3360: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3370: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63   a buffer for sc
3380: 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61  ratch memory spa
3390: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
33a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
33b0: 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  pScratch = va_ar
33c0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
33d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
33e0: 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63  lConfig.szScratc
33f0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3400: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3410: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3420: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
3430: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3460: 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20  NFIG_PAGECACHE: 
3470: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67  {.      /* Desig
3480: 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f  nate a buffer fo
3490: 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d  r page cache mem
34a0: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
34b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
34c0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
34d0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
34e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
34f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
3500: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
3510: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
3520: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3530: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
3540: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3560: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3570: 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20  FIG_PCACHE: {.  
3580: 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
3590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
35b0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
35c0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
35d0: 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  now an error */.
35e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3600: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3610: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3620: 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20  FIG_PCACHE2: {. 
3630: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3640: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
3650: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
3660: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3670: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3680: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20  onfig.pcache2 = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
36b0: 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ds2*);.      bre
36c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
36d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
36e0: 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20  _GETPCACHE2: {. 
36f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3700: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
3710: 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b  che2.xInit==0 ){
3720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3730: 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c 74  PCacheSetDefault
3740: 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
3750: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
3760: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3770: 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65  hods2*) = sqlite
3780: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
3790: 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65  ache2;.      bre
37a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
37b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
37c0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
37d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
37e0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
37f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3800: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
3810: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
3820: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 68  e a buffer for h
3830: 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  eap memory space
3840: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3850: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
3860: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3870: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3880: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3890: 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.nHeap = va_ar
38a0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
38b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
38c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61  onfig.mnReq = va
38d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a  _arg(ap, int);..
38e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
38f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3900: 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20  Req<1 ){.       
3910: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3920: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a  nfig.mnReq = 1;.
3930: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3940: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3950: 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32  fig.mnReq>(1<<12
3960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
3970: 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20  cap min request 
3980: 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a  size at 2^12 */.
3990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
39a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
39b0: 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20  q = (1<<12);.   
39c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
39d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39e0: 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a  fig.pHeap==0 ){.
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
3a00: 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69  e heap pointer i
3a10: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73  s NULL, then res
3a20: 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  tore the malloc 
3a30: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
3a40: 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74         ** back t
3a50: 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
3a60: 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  too.  This will 
3a70: 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63  cause the malloc
3a80: 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a   to go.        *
3a90: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65  * back to its de
3aa0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
3ab0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
3ac0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
3ad0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e  s.        ** run
3ae0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
3af0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c       memset(&sql
3b00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b10: 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  .m, 0, sizeof(sq
3b20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3b30: 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g.m));.      }el
3b40: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
3b50: 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20  he heap pointer 
3b60: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
3b70: 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66  n install one of
3b80: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
3b90: 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65  mem5.c/mem3.c me
3ba0: 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65  thods. If neithe
3bb0: 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  r ENABLE_MEMSYS3
3bc0: 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   nor.        ** 
3bd0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69  ENABLE_MEMSYS5 i
3be0: 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72  s defined, retur
3bf0: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
3c00: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
3c10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
3c20: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
3c30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c40: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
3c50: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
3c60: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
3c70: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3c80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3c90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
3ca0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
3cb0: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
3cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3cd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3ce0: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
3cf0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
3d00: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
3d10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3d20: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
3d30: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3d50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
3d60: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
3d70: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d90: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
3da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3db0: 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69 6f 6e  logger funcction
3dc0: 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61   and its first a
3dd0: 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20  rgument..    ** 
3de0: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e  The default is N
3df0: 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73  ULL.  Logging is
3e00: 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65   disabled if the
3e10: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
3e20: 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  r is.    ** NULL
3e30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3e40: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3e50: 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOG: {.      /* 
3e60: 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
3e70: 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
3e80: 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
3e90: 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
3ea0: 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
3eb0: 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
3ec0: 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
3ed0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3ee0: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
3ef0: 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a  p, void(*)(void*
3f00: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
3f10: 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
3f20: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
3f30: 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64  *LOGFUNC_t)(void
3f40: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
3f50: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
3f70: 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
3f80: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
3f90: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3fa0: 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20  onfig.pLogArg = 
3fb0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
3fc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
3fe0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
3ff0: 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  I: {.      sqlit
4000: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
4010: 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67  OpenUri = va_arg
4020: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4040: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4050: 4f 4e 46 49 47 5f 52 45 41 44 4f 4e 4c 59 3a 20  ONFIG_READONLY: 
4060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
4070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 52 65 61  lobalConfig.bRea
4080: 64 4f 6e 6c 79 20 3d 20 76 61 5f 61 72 67 28 61  dOnly = va_arg(a
4090: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
40a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
40b0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
40c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
40d0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
40e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
40f0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
4100: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4110: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
4120: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
4130: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4140: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
4150: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4160: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
4170: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
4180: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
4190: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
41a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
41b0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
41c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
41d0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
41e0: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
41f0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
4200: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
4210: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
4220: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
4230: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
4240: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
4250: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4260: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4270: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
4280: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
4290: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
42a0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
42b0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
42c0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
42d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
42e0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
42f0: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
4300: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
4310: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
4320: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
4330: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4340: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4350: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4360: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
4370: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
4380: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
4390: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
43a0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
43b0: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
43c0: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
43d0: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
43e0: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
43f0: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
4400: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4410: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
4420: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
4430: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4440: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4450: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4460: 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65  kaside slot afte
4470: 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65  r ROUNDDOWN8 nee
4480: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ds to be larger.
4490: 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e    ** than a poin
44a0: 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c  ter to be useful
44b0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f  ..  */.  sz = RO
44c0: 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f  UNDDOWN8(sz);  /
44d0: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
44e0: 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a  9382 */.  if( sz
44f0: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
4500: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
4510: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4520: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4530: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4540: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4550: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4560: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4570: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
4580: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
4590: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
45a0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
45b0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
45c0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
45d0: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
45e0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
45f0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
4600: 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20   pStart ) cnt = 
4610: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
4620: 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20  e(pStart)/sz;.  
4630: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72  }else{.    pStar
4640: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
4650: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
4660: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
4670: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4680: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
4690: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
46a0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
46b0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
46c0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
46d0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
46e0: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
46f0: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
4700: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
4710: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4720: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
4730: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
4740: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
4750: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
4760: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
4770: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4780: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
4790: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
47a0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
47b0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
47c0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
47d0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
47e0: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
47f0: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
4800: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4810: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
4820: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
4830: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
4840: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4850: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4860: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4870: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4880: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
4890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
48a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
48b0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
48c0: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
48d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
48e0: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
48f0: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
4900: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
4910: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
4920: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
4930: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
4940: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
4950: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
4960: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
4970: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
4980: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
4990: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
49a0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
49b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
49c0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
49d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
49e0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
49f0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4a00: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
4a10: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
4a20: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
4a30: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
4a40: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
4a50: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4a60: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
4a70: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
4a80: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
4a90: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
4aa0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
4ab0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4ac0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
4ad0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4ae0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
4af0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
4b00: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
4b10: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
4b20: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
4b30: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
4b40: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
4b50: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
4b60: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
4b70: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
4b80: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
4b90: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
4ba0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
4bb0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4bc0: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
4bd0: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
4be0: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
4bf0: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
4c00: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
4c10: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
4c20: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
4c30: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
4c40: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
4c50: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
4c60: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
4c70: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
4c80: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
4c90: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
4ca0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
4cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4cc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4cd0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
4ce0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
4cf0: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
4d00: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
4d10: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
4d20: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
4d30: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
4d40: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
4d50: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
4d60: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
4d70: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
4d80: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
4d90: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
4da0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
4db0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
4dc0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
4dd0: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
4de0: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
4df0: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
4e00: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
4e10: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
4e20: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
4e30: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
4e40: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
4e50: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4e60: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
4e70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
4e80: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
4e90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
4ea0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
4eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
4ec0: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
4ed0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
4ee0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
4ef0: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
4f00: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
4f10: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
4f20: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
4f30: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
4f40: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
4f50: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
4f60: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
4f70: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
4f80: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
4f90: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4fa0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
4fb0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
4fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4fd0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
4fe0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
4ff0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
5000: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5010: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
5020: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
5030: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
5040: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
5050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5060: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
5070: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
5080: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5090: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
50a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
50b0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
50c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
50d0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
50e0: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
50f0: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
5100: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
5110: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
5120: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
5130: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
5140: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
5150: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
5160: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
5170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
5180: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
5190: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
51a0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
51b0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
51c0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
51d0: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
51e0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
51f0: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
5200: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
5210: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
5220: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
5230: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
5240: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
5250: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
5260: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
5270: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
5280: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
5290: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
52a0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
52b0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
52c0: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
52d0: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
52e0: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
52f0: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
5300: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
5310: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5320: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
5330: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
5340: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
5350: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
5360: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
5370: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
5380: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
5390: 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
53a0: 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74   rc unchanged at
53b0: 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   0 */.    }else{
53c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
53d0: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
53e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
53f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
5400: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
5410: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
5420: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
5430: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
5440: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
5450: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
5460: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
5470: 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ant.** compariso
5480: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
5490: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
54a0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
54b0: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
54c0: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
54d0: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
54e0: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
54f0: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
5500: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
5510: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
5520: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
5530: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
5540: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
5550: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
5560: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
5570: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
5580: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
5590: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
55a0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
55b0: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
55c0: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
55d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
55e0: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
55f0: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
5600: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
5610: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
5620: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
5630: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
5640: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
5650: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
5660: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
5670: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
5680: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5690: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
56a0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
56b0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
56c0: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
56d0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
56e0: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
56f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5700: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
5710: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5720: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
5730: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
5740: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5750: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5760: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
5770: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
5780: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5790: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
57a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
57b0: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
57c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
57d0: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
57e0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
57f0: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
5800: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5810: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
5820: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
5830: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
5840: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
5850: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5860: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
5870: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
5880: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
5890: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
58a0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
58b0: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
58c0: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
58d0: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
58e0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
58f0: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
5900: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
5910: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
5920: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
5930: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
5940: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
5950: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
5960: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
5970: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
5980: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
5990: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
59a0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
59b0: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
59c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
59d0: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
59e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
59f0: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
5a00: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
5a10: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
5a20: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
5a30: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
5a40: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
5a50: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
5a60: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
5a70: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
5a80: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
5a90: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
5aa0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
5ab0: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
5ac0: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
5ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5ae0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
5af0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
5b00: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
5b10: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
5b20: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
5b30: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
5b40: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
5b50: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
5b60: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
5b70: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
5b80: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
5b90: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
5ba0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
5bb0: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
5bc0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5bd0: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
5be0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
5bf0: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
5c00: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61   all sqlite3_vta
5c10: 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62  b objects that b
5c20: 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73  elong to databas
5c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
5c40: 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  db. This is call
5c50: 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65  ed when db is be
5c60: 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  ing closed..*/.s
5c70: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f  tatic void disco
5c80: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c  nnectAllVtab(sql
5c90: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64  ite3 *db){.#ifnd
5ca0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5cb0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
5cc0: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t i;.  sqlite3Bt
5cd0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
5ce0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
5cf0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
5d00: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
5d10: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
5d20: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
5d30: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
5d40: 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  a ){.      HashE
5d50: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  lem *p;.      fo
5d60: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
5d70: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
5d80: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
5d90: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
5da0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
5db0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
5dc0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
5dd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
5de0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
5df0: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
5e00: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
5e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5e20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
5e30: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
5e40: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
5e50: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65  ARAMETER(db);.#e
5e60: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
5e70: 74 75 72 6e 20 54 52 55 45 20 69 66 20 64 61 74  turn TRUE if dat
5e80: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5e90: 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69   db has unfinali
5ea0: 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  zed prepared.** 
5eb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
5ec0: 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33  finished sqlite3
5ed0: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e  _backup objects.
5ee0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
5ef0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
5f00: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
5f10: 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72    int j;.  asser
5f20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5f30: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
5f40: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   );.  if( db->pV
5f50: 64 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  dbe ) return 1;.
5f60: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
5f70: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
5f80: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
5f90: 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[j].pBt;.   
5fa0: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
5fb0: 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b  te3BtreeIsInBack
5fc0: 75 70 28 70 42 74 29 20 29 20 72 65 74 75 72 6e  up(pBt) ) return
5fd0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
5fe0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
5ff0: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53  se an existing S
6000: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a  QLite database.*
6010: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
6020: 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65  ite3Close(sqlite
6030: 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65  3 *db, int force
6040: 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21  Zombie){.  if( !
6050: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
6060: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
6070: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6080: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
6090: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
60a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
60b0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
60c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
60d0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  r(db->mutex);.. 
60e0: 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f   /* Force xDisco
60f0: 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61  nnect calls on a
6100: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
6110: 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63  s */.  disconnec
6120: 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20  tAllVtab(db);.. 
6130: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
6140: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
6150: 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  e disconnectAllV
6160: 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  tab() call above
6170: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68  .  ** will not h
6180: 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78  ave called the x
6190: 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74  Disconnect() met
61a0: 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75  hod on any virtu
61b0: 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69  al.  ** tables i
61c0: 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  n the db->aVTran
61d0: 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  s[] array. The f
61e0: 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
61f0: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20  VtabRollback(). 
6200: 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f   ** call will do
6210: 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20   so. We need to 
6220: 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74  do this before t
6230: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74  he check for act
6240: 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ive.  ** SQL sta
6250: 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61  tements below, a
6260: 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d  s the v-table im
6270: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
6280: 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a   be storing.  **
6290: 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73   some prepared s
62a0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e  tatements intern
62b0: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ally..  */.  sql
62c0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
62d0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61  (db);..  /* Lega
62e0: 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c  cy behavior (sql
62f0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68  ite3_close() beh
6300: 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74  avior) is to ret
6310: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
6320: 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e  BUSY if the conn
6330: 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62  ection can not b
6340: 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61  e closed immedia
6350: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
6360: 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26   !forceZombie &&
6370: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
6380: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
6390: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
63a0: 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62  LITE_BUSY, "unab
63b0: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
63c0: 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22  to unfinalized "
63d0: 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65  .       "stateme
63e0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
63f0: 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20  d backups");.   
6400: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6410: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
6420: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6430: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
6440: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
6450: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
6460: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
6470: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
6480: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
6490: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
64a0: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
64b0: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
64c0: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
64d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
64e0: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
64f0: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
6500: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
6510: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
6520: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
6530: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
6540: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
6550: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
6560: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
6570: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
6580: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
6590: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
65a0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
65b0: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
65c0: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
65d0: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
65e0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
65f0: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
6600: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6610: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
6620: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
6630: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
6640: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
6650: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
6660: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
6670: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
6680: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
6690: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
66a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
66b0: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
66c0: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
66d0: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
66e0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
66f0: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
6700: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6710: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
6720: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
6730: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
6740: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6750: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
6760: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
6770: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6780: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
6790: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
67a0: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
67b0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
67c0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
67d0: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
67e0: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
67f0: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
6800: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
6810: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
6820: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
6830: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
6840: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
6850: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
6860: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
6870: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6880: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
6890: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
68a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
68b0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
68c0: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
68d0: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
68e0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
68f0: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
6900: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
6910: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
6920: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
6930: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
6940: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
6950: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
6960: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
6970: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
6980: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
6990: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
69a0: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
69b0: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
69c0: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
69d0: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
69e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
69f0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
6a00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
6a10: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
6a20: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
6a30: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
6a40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
6a50: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
6a60: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
6a70: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
6a80: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
6a90: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
6aa0: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ed to sqlite3_cl
6ab0: 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ose (meaning tha
6ac0: 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65  t it is a zombie
6ad0: 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20  ).  Therefore,. 
6ae0: 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64   ** go ahead and
6af0: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
6b00: 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ces..  */..  /* 
6b10: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
6b20: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
6b30: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
6b40: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
6b50: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f  points(db);..  /
6b60: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61  * Close all data
6b70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
6b80: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
6b90: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
6ba0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
6bb0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
6bc0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
6bd0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
6be0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
6bf0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
6c00: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
6c10: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
6c20: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
6c30: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
6c40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
6c50: 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73  Clear the TEMP s
6c60: 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79  chema separately
6c70: 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69   and last */.  i
6c80: 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  f( db->aDb[1].pS
6c90: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c  chema ){.    sql
6ca0: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
6cb0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
6cc0: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
6cd0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
6ce0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  (db);..  /* Free
6cf0: 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
6d00: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
6d10: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
6d20: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
6d30: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73  eArray(db);.  as
6d40: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
6d50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
6d60: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
6d70: 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65  atic );..  /* Te
6d80: 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e  ll the code in n
6d90: 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65  otify.c that the
6da0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c   connection no l
6db0: 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a  onger holds any.
6dc0: 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64    ** locks and d
6dd0: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
6de0: 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f  any further unlo
6df0: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
6e00: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
6e10: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f  te3ConnectionClo
6e20: 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  sed(db);..  for(
6e30: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
6e40: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
6e50: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
6e60: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
6e70: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
6e80: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
6e90: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
6ea0: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
6eb0: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
6ec0: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
6ed0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
6ee0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
6ef0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
6f00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
6f10: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
6f20: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
6f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6f40: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
6f50: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
6f60: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
6f70: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
6f80: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
6f90: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
6fa0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
6fb0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
6fc0: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
6fd0: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
6fe0: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
6ff0: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
7000: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
7010: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
7020: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
7030: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
7040: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
7050: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
7060: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7070: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7080: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
7090: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
70a0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
70b0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
70c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
70d0: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
70e0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
70f0: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
7100: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
7110: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
7120: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
7130: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
7140: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
7150: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
7160: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
7170: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
7180: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7190: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
71a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
71b0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
71c0: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
71d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
71e0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
71f0: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
7200: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
7210: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
7220: 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a  if( db->pErr ){.
7230: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
7240: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
7250: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f    }.  sqlite3Clo
7260: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
7270: 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
7280: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
7290: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
72a0: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
72b0: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
72c0: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
72d0: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
72e0: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
72f0: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
7300: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
7310: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
7320: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
7330: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
7340: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
7350: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
7360: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
7370: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
7380: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
7390: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
73a0: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
73b0: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
73c0: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
73d0: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
73e0: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
73f0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
7400: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7410: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7420: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
7430: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
7440: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
7450: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
7460: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
7470: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
7480: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
7490: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
74a0: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
74b0: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
74c0: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
74d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
74e0: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
74f0: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
7500: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
7510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
7520: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
7530: 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70   files.  If trip
7540: 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
7550: 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61  TE_OK, then.** a
7560: 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  ny open cursors 
7570: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
7580: 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73 20  ("tripped" - as 
7590: 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20 63  in "tripping a c
75a0: 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65  ircuit.** breake
75b0: 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20  r") and made to 
75c0: 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20  return tripCode 
75d0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
75e0: 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65   further.** atte
75f0: 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61 74  mpts to use that
7600: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64   cursor..*/.void
7610: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
7620: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
7630: 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a   int tripCode){.
7640: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
7650: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61 73  nTrans = 0;.  as
7660: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7670: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
7680: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
7690: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
76a0: 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  c();.  for(i=0; 
76b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
76c0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
76d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
76e0: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
76f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
7700: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
7710: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
7720: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
7730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7740: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72  eeRollback(p, tr
7750: 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 64  ipCode);.      d
7760: 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e  b->aDb[i].inTran
7770: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
7780: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
7790: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
77a0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
77b0: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 64  lloc();..  if( d
77c0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
77d0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
77e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
77f0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
7800: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
7810: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
7820: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
7830: 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  (db);.  }..  /* 
7840: 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e  Any deferred con
7850: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
7860: 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  ns have now been
7870: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
7880: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
7890: 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  s = 0;..  /* If 
78a0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
78b0: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
78c0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
78d0: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
78e0: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
78f0: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
7900: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
7910: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
7920: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
7930: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
7940: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
7950: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7960: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
7970: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7980: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
7990: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
79a0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
79b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
79c0: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
79d0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
79e0: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
79f0: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
7a00: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
7a10: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
7a20: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
7a30: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
7a40: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
7a50: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
7a60: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
7a70: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
7a80: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
7a90: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
7aa0: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
7ab0: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
7ac0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7ad0: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
7ae0: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
7af0: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
7b00: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7b10: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
7b20: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
7b30: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7b40: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
7b50: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
7b60: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
7b70: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
7b80: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
7b90: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
7ba0: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
7bb0: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
7bc0: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
7bd0: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
7be0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
7bf0: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
7c00: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
7c10: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
7c20: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
7c30: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
7c40: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
7c50: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
7c60: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
7c70: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
7c80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
7c90: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
7ca0: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
7cb0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
7cc0: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
7cd0: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
7ce0: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
7cf0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
7d00: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
7d10: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
7d20: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
7d30: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
7d40: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
7d50: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
7d60: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
7d70: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
7d80: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
7d90: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
7da0: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
7db0: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
7dc0: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
7dd0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
7de0: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
7df0: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
7e00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
7e10: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
7e20: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
7e30: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7e40: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
7e50: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
7e60: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
7e70: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
7e80: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
7e90: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
7ea0: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
7eb0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
7ec0: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
7ed0: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
7ee0: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
7ef0: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
7f00: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
7f10: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
7f20: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
7f30: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
7f40: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
7f50: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
7f60: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
7f70: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
7f80: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
7f90: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
7fa0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
7fb0: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
7fc0: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
7fd0: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
7fe0: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
7ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
8000: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
8010: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
8020: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
8030: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
8040: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
8050: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
8060: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
8070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8080: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8090: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
80a0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
80b0: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
80c0: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
80d0: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
80e0: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
80f0: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
8100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8110: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8120: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
8130: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
8140: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
8150: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
8160: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
8170: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
8180: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
8190: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
81a0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
81b0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
81c0: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
81d0: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
81e0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
81f0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
8200: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
8210: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
8220: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
8230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
8240: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8250: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8270: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
8280: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
8290: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
82a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
82b0: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
82c0: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
82d0: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
82e0: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
82f0: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
8300: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
8310: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
8320: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
8330: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
8340: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
8350: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
8360: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
8370: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
8380: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
8390: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
83a0: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
83b0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
83c0: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
83d0: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
83e0: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
83f0: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
8400: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
8410: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
8420: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
8430: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
8440: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
8450: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
8460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
8470: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
8480: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
8490: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
84a0: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
84b0: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
84c0: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
84d0: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
84e0: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
84f0: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
8500: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
8510: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8520: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
8530: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
8540: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
8550: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
8560: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
8570: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
8580: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
8590: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
85a0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
85b0: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
85c0: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
85d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
85e0: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
85f0: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
8600: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
8610: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
8620: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
8630: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
8640: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8650: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
8660: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
8670: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
8680: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
8690: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
86a0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
86b0: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
86c0: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
86d0: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
86e0: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
86f0: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
8700: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8710: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
8720: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
8730: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
8740: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
8750: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
8760: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
8770: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
8780: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
8790: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
87a0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
87b0: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
87c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
87d0: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
87e0: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
87f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
8800: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
8810: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
8820: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
8830: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
8840: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
8850: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
8860: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
8870: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
8880: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
8890: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
88a0: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
88b0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
88c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
88d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
88e0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
88f0: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
8900: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
8910: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
8920: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
8930: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
8940: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8950: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8960: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8970: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
8980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
8990: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
89a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
89b0: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
89c0: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
89d0: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
89e0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
89f0: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
8a00: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
8a10: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
8a20: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
8a30: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
8a40: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
8a50: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
8a60: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
8a70: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
8a80: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
8a90: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
8aa0: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
8ab0: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
8ac0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
8ad0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
8ae0: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
8af0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
8b00: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
8b10: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
8b20: 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73  ogressOps = nOps
8b30: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
8b40: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
8b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
8b60: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
8b70: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
8b80: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
8b90: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
8ba0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
8bb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8bc0: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
8bd0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
8be0: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
8bf0: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
8c00: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
8c10: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
8c20: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
8c30: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
8c40: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
8c50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8c60: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
8c70: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
8c80: 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  s){.  if( ms>0 )
8c90: 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  {.    db->busyTi
8ca0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20  meout = ms;.    
8cb0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
8cc0: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
8cd0: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
8ce0: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
8cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8d00: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
8d10: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
8d20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8d30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
8d40: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
8d50: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
8d60: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
8d70: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
8d80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
8d90: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
8da0: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e   *db){.  db->u1.
8db0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
8dc0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
8dd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
8de0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
8df0: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
8e00: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
8e10: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
8e20: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
8e30: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
8e40: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
8e50: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
8e60: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
8e70: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
8e80: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8e90: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
8ea0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
8eb0: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
8ec0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
8ed0: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
8ee0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
8ef0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8f00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8f10: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
8f20: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
8f30: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
8f40: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
8f50: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
8f60: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8f70: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
8f80: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
8f90: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
8fa0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
8fb0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
8fc0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
8fd0: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e  context*),.  Fun
8fe0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
8ff0: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
9000: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
9010: 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74  nName;..  assert
9020: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9030: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
9040: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
9050: 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20  onName==0 ||.   
9060: 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78 46     (xFunc && (xF
9070: 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20  inal || xStep)) 
9080: 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e  || .      (!xFun
9090: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20  c && (xFinal && 
90a0: 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20  !xStep)) ||.    
90b0: 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21 78    (!xFunc && (!x
90c0: 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29  Final && xStep))
90d0: 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c   ||.      (nArg<
90e0: 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54  -1 || nArg>SQLIT
90f0: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
9100: 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35  RG) ||.      (25
9110: 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  5<(nName = sqlit
9120: 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e  e3Strlen30( zFun
9130: 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a  ctionName))) ){.
9140: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9150: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
9160: 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51   }.  .#ifndef SQ
9170: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
9180: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
9190: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
91a0: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
91b0: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
91c0: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
91d0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
91e0: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
91f0: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
9200: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
9210: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
9220: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
9230: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
9240: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
9250: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
9260: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
9270: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
9280: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
9290: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
92a0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
92b0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
92c0: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
92d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
92e0: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
92f0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
9300: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
9310: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
9320: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
9330: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
9340: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
9350: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
9360: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
9370: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
9380: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
9390: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
93a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
93b0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
93c0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
93d0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
93e0: 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  F16LE,.         
93f0: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
9400: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
9410: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
9420: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9430: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9440: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9450: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
9460: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
9470: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
9480: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
9490: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
94a0: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
94b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
94c0: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
94d0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
94e0: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
94f0: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
9500: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
9510: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
9520: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
9530: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
9540: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
9550: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
9560: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
9570: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
9580: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
9590: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
95a0: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
95b0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
95c0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
95d0: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
95e0: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
95f0: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
9600: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
9610: 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26  >iPrefEnc==enc &
9620: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
9630: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
9640: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
9650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9660: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
9670: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
9680: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
9690: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
96a0: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
96b0: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
96c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
96d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
96e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
96f0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
9700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9710: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
9720: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
9730: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
9740: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
9750: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
9760: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
9770: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
9780: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
9790: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
97a0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
97b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
97c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
97d0: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
97e0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
97f0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
9800: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
9810: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
9820: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
9830: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
9840: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
9850: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
9860: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
9870: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
9880: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
9890: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
98a0: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
98b0: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
98c0: 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30  ;.  p->flags = 0
98d0: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
98e0: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
98f0: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
9900: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
9910: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
9920: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
9930: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
9940: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
9950: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9960: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
9970: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
9980: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
9990: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
99a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
99b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
99c0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
99d0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
99e0: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
99f0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
9a00: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
9a10: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
9a20: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
9a30: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
9a40: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
9a50: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
9a60: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
9a70: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
9a80: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
9a90: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
9aa0: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
9ab0: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
9ac0: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
9af0: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
9b00: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
9b10: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
9b20: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
9b30: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
9b40: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
9b50: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
9b60: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
9b70: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
9b80: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
9b90: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
9ba0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
9bb0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
9bc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
9bd0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
9be0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
9bf0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
9c00: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
9c10: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9c20: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
9c30: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
9c40: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
9c50: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9c60: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
9c70: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
9c80: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
9c90: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
9ca0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9cb0: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
9cc0: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
9cd0: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
9ce0: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
9cf0: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
9d00: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
9d10: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
9d20: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
9d30: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
9d40: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
9d50: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
9d60: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
9d70: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
9d80: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
9d90: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
9da0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
9db0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
9dc0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
9dd0: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
9de0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9df0: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
9e00: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
9e10: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
9e20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9e30: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9e40: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9e50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9e60: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
9e70: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
9e80: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
9e90: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
9ea0: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
9eb0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
9ec0: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
9ed0: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
9ee0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
9ef0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
9f00: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
9f10: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
9f20: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
9f30: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
9f40: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
9f50: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
9f60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
9f70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
9f80: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
9f90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9fa0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9fb0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
9fc0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
9fd0: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
9fe0: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
9ff0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
a000: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
a010: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
a020: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
a030: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
a040: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
a050: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
a060: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
a070: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
a080: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a090: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
a0a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a0b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a0c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a0d0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
a0e0: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
a0f0: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
a100: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
a110: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
a120: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
a130: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
a140: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
a150: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
a160: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
a170: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
a180: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
a190: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
a1a0: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
a1b0: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
a1c0: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
a1d0: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
a1e0: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
a1f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
a200: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
a210: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
a220: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
a230: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
a240: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
a250: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
a260: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
a270: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
a280: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
a290: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
a2a0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
a2b0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
a2c0: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
a2d0: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
a2e0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
a2f0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
a300: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
a310: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
a320: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
a330: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
a340: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a350: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
a360: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
a370: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
a380: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
a390: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
a3a0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
a3b0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
a3c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a3d0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
a3e0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
a3f0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
a420: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
a430: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
a440: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
a450: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
a460: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a470: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a480: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
a490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a4a0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
a4b0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
a4c0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
a4d0: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
a4e0: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
a4f0: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
a500: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
a510: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
a520: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
a530: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
a540: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
a550: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
a560: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a570: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
a580: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
a590: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
a5a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
a5b0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
a5c0: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
a5d0: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
a5e0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
a5f0: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
a600: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
a610: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a620: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a630: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
a640: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
a650: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
a660: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
a670: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
a680: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a690: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
a6a0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
a6b0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
a6c0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
a6d0: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
a6e0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
a6f0: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
a700: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
a710: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
a720: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
a730: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
a740: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
a750: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
a760: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
a770: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
a780: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
a790: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
a7a0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
a7b0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
a7c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
a7d0: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
a7e0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
a7f0: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
a800: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
a810: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
a820: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
a830: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
a840: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
a850: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
a860: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
a870: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
a880: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
a890: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
a8a0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
a8b0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
a8c0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
a8d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
a8e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
a8f0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
a900: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
a910: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
a920: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
a930: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
a940: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
a950: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
a960: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
a970: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
a980: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
a990: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
a9a0: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
a9b0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
a9c0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
a9d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9f0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
aa00: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
aa10: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
aa20: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
aa30: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
aa40: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
aa50: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
aa60: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
aa70: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
aa80: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
aa90: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
aaa0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
aab0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
aac0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
aad0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
aae0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
aaf0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
ab00: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
ab10: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
ab20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ab30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ab40: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
ab50: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
ab60: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
ab70: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
ab80: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
ab90: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
aba0: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
abb0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
abc0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
abd0: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
abe0: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
abf0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
ac00: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
ac10: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
ac20: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
ac30: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
ac40: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
ac50: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
ac60: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
ac70: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ac90: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
aca0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
acb0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
acc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
acd0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ace0: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
acf0: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
ad00: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
ad10: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
ad20: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
ad30: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
ad40: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ad50: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ad60: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
ad70: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
ad80: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
ad90: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
ada0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
adb0: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
adc0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
add0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
ade0: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
adf0: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
ae00: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
ae10: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
ae20: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
ae30: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
ae40: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
ae50: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
ae60: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
ae70: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
ae80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
ae90: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
aea0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
aeb0: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
aec0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
aed0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
aee0: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
aef0: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
af00: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
af10: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
af20: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
af30: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
af40: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
af50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
af60: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
af70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
af80: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
af90: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
afa0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
afb0: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
afc0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
afd0: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
afe0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
aff0: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
b000: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
b010: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
b020: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
b030: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
b040: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
b050: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
b060: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
b070: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
b080: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
b090: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
b0a0: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
b0b0: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
b0c0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
b0d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
b0e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
b0f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
b100: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
b110: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
b120: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
b130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b140: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
b150: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
b160: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
b170: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
b180: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
b190: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
b1a0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
b1b0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
b1c0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
b1d0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
b1e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b1f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
b200: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b210: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
b220: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
b230: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
b240: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
b250: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
b260: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
b270: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
b280: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
b290: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
b2a0: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
b2b0: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
b2c0: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
b2d0: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
b2e0: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
b2f0: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
b300: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
b310: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
b320: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
b330: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
b340: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
b350: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
b360: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
b370: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
b380: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
b390: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
b3a0: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
b3b0: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
b3c0: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
b3d0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
b3e0: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
b3f0: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
b400: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
b410: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
b420: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
b430: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
b440: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
b450: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
b460: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
b470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
b480: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
b490: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
b4a0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
b4b0: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
b4c0: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
b4d0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
b4e0: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
b4f0: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
b500: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
b510: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
b520: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
b530: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
b540: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
b550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b560: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
b570: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
b580: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
b590: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
b5a0: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
b5b0: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
b5c0: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
b5d0: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
b5e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
b5f0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
b600: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b620: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
b630: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
b640: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
b650: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
b660: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
b670: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
b680: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
b6b0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
b6c0: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
b6d0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
b6e0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
b6f0: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
b700: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
b710: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
b720: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
b730: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
b740: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
b750: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
b760: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
b770: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b780: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
b790: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
b7a0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
b7b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
b7c0: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
b7d0: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
b7e0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
b7f0: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
b800: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
b810: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
b820: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
b830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b850: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
b860: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
b870: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
b880: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
b890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
b8a0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
b8b0: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
b8c0: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8e0: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
b8f0: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
b900: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
b930: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
b940: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
b950: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
b960: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
b970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b980: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
b9b0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
b9c0: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
b9d0: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
b9e0: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
b9f0: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
ba00: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
ba10: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
ba20: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
ba30: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
ba40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
ba50: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
ba60: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
ba70: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
ba80: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
ba90: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
baa0: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
bab0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
bac0: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
bad0: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
bae0: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
baf0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
bb00: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
bb10: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
bb20: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
bb30: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
bb40: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
bb50: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
bb60: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
bb70: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
bb80: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
bb90: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
bba0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
bbb0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
bbc0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
bbd0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
bbe0: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
bbf0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
bc00: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
bc10: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
bc20: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
bc30: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
bc40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bc50: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
bc60: 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
bc70: 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
bc80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
bc90: 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
bca0: 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
bcb0: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
bcc0: 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
bcd0: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
bce0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
bcf0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
bd00: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
bd10: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
bd20: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
bd30: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
bd40: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
bd50: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
bd60: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
bd70: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
bd80: 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
bd90: 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
bda0: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
bdb0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
bdc0: 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
bdd0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
bde0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
bdf0: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
be00: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
be10: 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72  r *zDb){.  retur
be20: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
be30: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20  eckpoint_v2(db, 
be40: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43  zDb, SQLITE_CHEC
be50: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
be60: 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  0, 0);.}..#ifnde
be70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
be80: 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
be90: 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
bea0: 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
beb0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
bec0: 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
bed0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
bee0: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
bef0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
bf00: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
bf10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
bf20: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
bf30: 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
bf40: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
bf50: 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
bf60: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
bf70: 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
bf80: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
bf90: 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
bfa0: 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
bfb0: 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
bfc0: 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
bfd0: 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
bfe0: 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
bff0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
c000: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
c010: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
c020: 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
c030: 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
c040: 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
c050: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
c060: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
c070: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
c080: 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
c090: 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
c0a0: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
c0b0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
c0c0: 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
c0d0: 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
c0e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
c0f0: 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
c100: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
c110: 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
c120: 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
c130: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
c140: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
c150: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
c160: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
c170: 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
c180: 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
c190: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
c1a0: 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
c1b0: 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
c1c0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
c1d0: 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
c1e0: 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
c1f0: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
c200: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
c210: 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
c220: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
c230: 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
c240: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c260: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
c270: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
c2a0: 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
c2b0: 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
c2c0: 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2e0: 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
c2f0: 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
c300: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
c310: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c320: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
c330: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c340: 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
c350: 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
c360: 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
c370: 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
c380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
c390: 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
c3a0: 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
c3b0: 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
c3c0: 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
c3d0: 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
c3e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
c3f0: 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
c400: 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
c410: 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
c420: 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
c430: 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
c440: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
c450: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
c460: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
c470: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
c480: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c4a0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
c4b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
c4c0: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
c4d0: 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
c4e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c4f0: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
c500: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
c510: 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
c520: 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
c530: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
c540: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
c550: 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
c560: 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
c570: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
c580: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
c590: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
c5a0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
c5b0: 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
c5c0: 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
c5d0: 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
c5e0: 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
c5f0: 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
c600: 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
c610: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
c620: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
c630: 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
c640: 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
c650: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
c660: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
c670: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
c680: 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
c690: 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
c6a0: 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
c6b0: 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
c6c0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
c6d0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
c6e0: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
c6f0: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
c700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c710: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
c740: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
c750: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
c760: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
c770: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
c780: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
c790: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
c7a0: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
c7b0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
c7d0: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
c7e0: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
c820: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
c850: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
c860: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
c890: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
c8a0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
c8b0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
c8c0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
c8d0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
c8e0: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
c8f0: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
c900: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
c910: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
c920: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
c930: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
c940: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
c950: 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
c960: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
c970: 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
c980: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
c990: 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
c9a0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
c9b0: 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
c9c0: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
c9d0: 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
c9e0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
c9f0: 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72  STORE==3.  retur
ca00: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
ca10: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
ca20: 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
ca30: 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74  MP_STORE>3.  ret
ca40: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
ca50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
ca60: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
ca70: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
ca80: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
ca90: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
caa0: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
cab0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
cac0: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
cad0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
cae0: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
caf0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
cb00: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
cb10: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
cb20: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
cb30: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
cb40: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
cb50: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
cb60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
cb70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
cb80: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
cb90: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
cba0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cbb0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
cbc0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
cbd0: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
cbe0: 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  .    z = (char*)
cbf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
cc00: 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
cc10: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
cc20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
cc30: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
cc40: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
cc50: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
cc60: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
cc70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
cc80: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
cc90: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
cca0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ccb0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
ccc0: 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
ccd0: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
cce0: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
ccf0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
cd00: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
cd10: 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
cd20: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
cd30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
cd40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
cd50: 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
cd60: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
cd70: 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
cd80: 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
cd90: 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
cda0: 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
cdb0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
cdc0: 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
cdd0: 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27  'l', 'i', 'b', '
cde0: 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79  r', 'a', 'r', 'y
cdf0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27  ', ' ', .    'r'
ce00: 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c  , 'o', 'u', 't',
ce10: 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20   'i', 'n', 'e', 
ce20: 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27  ' ', .    'c', '
ce30: 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65  a', 'l', 'l', 'e
ce40: 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'd', ' ', .  
ce50: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
ce60: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
ce70: 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'f', ' ', .    '
ce80: 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75  s', 'e', 'q', 'u
ce90: 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27  ', 'e', 'n', 'c'
cea0: 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20  , 'e', 0.  };.. 
ceb0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
cec0: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
ced0: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
cee0: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20  outOfMem;.  }.  
cef0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
cf00: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
cf10: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
cf20: 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65  n (void *)misuse
cf30: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
cf40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cf50: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
cf60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
cf70: 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20  {.    z = (void 
cf80: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65  *)outOfMem;.  }e
cf90: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
cfa0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
cfb0: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
cfc0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
cfd0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
cfe0: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
cff0: 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  -1, sqlite3ErrSt
d000: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a  r(db->errCode),.
d010: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
d020: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
d030: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20  TATIC);.      z 
d040: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
d050: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
d060: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
d070: 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
d080: 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
d090: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
d0a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
d0b0: 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
d0c0: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
d0d0: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
d0e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d0f0: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
d100: 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
d110: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
d120: 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
d130: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
d140: 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
d150: 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
d160: 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
d170: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
d180: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
d190: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
d1a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
d1b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d1c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d1d0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d1e0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
d1f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
d200: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
d210: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
d220: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
d230: 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
d240: 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
d250: 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
d260: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
d270: 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
d280: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
d290: 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
d2a0: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
d2b0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
d2c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
d2d0: 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
d2e0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
d2f0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
d300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d310: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
d320: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
d330: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d340: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d350: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
d360: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
d370: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
d380: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
d390: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
d3a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
d3b0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
d3c0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
d3d0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
d3e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d3f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
d400: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
d410: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
d420: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d430: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
d440: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
d450: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  de;.}../*.** Cre
d460: 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
d470: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
d480: 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
d490: 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
d4a0: 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
d4b0: 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
d4c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
d4d0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
d4e0: 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
d4f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
d500: 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76  , .  u8 enc,.  v
d510: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
d520: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
d530: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
d540: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
d550: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
d560: 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
d570: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
d580: 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20  int enc2;.  int 
d590: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
d5a0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
d5b0: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
d5c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d5d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
d5e0: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
d5f0: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
d600: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
d610: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
d620: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
d630: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
d640: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
d650: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
d660: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
d670: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
d680: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
d690: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
d6a0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
d6b0: 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
d6c0: 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
d6d0: 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
d6e0: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
d6f0: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
d700: 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
d710: 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
d720: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
d730: 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
d740: 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
d750: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
d760: 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
d770: 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
d780: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
d790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d7a0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d7b0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
d7c0: 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
d7d0: 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
d7e0: 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
d7f0: 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
d800: 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
d810: 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
d820: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
d830: 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
d840: 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
d850: 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
d860: 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
d870: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
d880: 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
d890: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
d8a0: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
d8b0: 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
d8c0: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
d8d0: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
d8e0: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
d8f0: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
d900: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
d910: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
d920: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
d930: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63   delete/modify c
d940: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
d950: 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  e due to active 
d960: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
d970: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d980: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
d990: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
d9a0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
d9b0: 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  s(db);..    /* I
d9c0: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
d9d0: 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
d9e0: 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
d9f0: 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
da00: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
da10: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
da20: 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
da30: 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
da40: 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
da50: 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
da60: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
da70: 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
da80: 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
da90: 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
daa0: 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
dab0: 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
dac0: 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
dad0: 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
dae0: 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
daf0: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
db00: 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
db10: 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
db20: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
db30: 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
db40: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
db50: 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20  CollSeq, zName, 
db60: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  nName);.      in
db70: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
db80: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
db90: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
dba0: 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
dbb0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
dbc0: 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
dbd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
dbe0: 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
dbf0: 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
dc00: 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
dc10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
dc20: 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
dc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dc40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
dc50: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
dc60: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
dc70: 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
dc80: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
dc90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
dca0: 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
dcb0: 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
dcc0: 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
dcd0: 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
dce0: 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
dcf0: 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
dd00: 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
dd10: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
dd20: 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
dd30: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
dd40: 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  OK, 0);.  return
dd50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
dd60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
dd70: 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
dd80: 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
dd90: 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
dda0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
ddb0: 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
ddc0: 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
ddd0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
dde0: 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
ddf0: 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
de00: 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
de10: 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
de20: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
de30: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
de40: 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
de50: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
de60: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
de70: 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
de80: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
de90: 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
dea0: 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
deb0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
dec0: 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
ded0: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
dee0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
def0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
df00: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
df10: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20  IABLE_NUMBER,.  
df20: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
df30: 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a  ER_DEPTH,.};../*
df40: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
df50: 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
df60: 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
df70: 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
df80: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
df90: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
dfa0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
dfb0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
dfc0: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
dfd0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
dfe0: 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
dff0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
e000: 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
e010: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
e020: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e030: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
e040: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
e050: 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
e060: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
e070: 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
e080: 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
e090: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
e0a0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
e0b0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
e0c0: 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
e0d0: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
e0e0: 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
e0f0: 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
e100: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
e110: 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
e120: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
e130: 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
e140: 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
e150: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
e160: 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
e170: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
e180: 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20  TION_ARG>1000.# 
e190: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
e1a0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75  _FUNCTION_ARG mu
e1b0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
e1c0: 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a  and 1000.#endif.
e1d0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
e1e0: 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c  TTACHED<0 || SQL
e1f0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
e200: 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  >62.# error SQLI
e210: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
e220: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
e230: 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66 0a  0 and 62.#endif.
e240: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
e250: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
e260: 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
e270: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
e280: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
e290: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
e2a0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e2b0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
e2c0: 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
e2d0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
e2e0: 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
e2f0: 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
e300: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
e310: 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
e320: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
e330: 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
e340: 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
e350: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
e360: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
e370: 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
e380: 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
e390: 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
e3a0: 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
e3b0: 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
e3c0: 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
e3d0: 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
e3e0: 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
e3f0: 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
e400: 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
e410: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
e420: 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
e430: 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
e440: 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
e450: 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
e460: 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
e470: 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
e480: 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
e490: 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
e4a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
e4b0: 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
e4c0: 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
e4d0: 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
e4e0: 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a  int oldLimit;...
e4f0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
e500: 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
e510: 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
e520: 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
e530: 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
e540: 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
e550: 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
e560: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
e570: 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
e580: 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
e590: 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
e5a0: 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
e5b0: 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
e5c0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
e5d0: 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
e5e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
e5f0: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
e600: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
e610: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
e620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
e630: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
e640: 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
e650: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
e660: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
e670: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
e680: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
e690: 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
e6a0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
e6b0: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
e6c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
e6d0: 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
e6e0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
e6f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
e700: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
e710: 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
e720: 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
e730: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
e740: 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
e750: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
e760: 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
e770: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
e780: 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
e790: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e7a0: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
e7b0: 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
e7c0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
e7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
e7e0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
e7f0: 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
e800: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
e810: 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
e820: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e830: 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
e840: 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
e880: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
e890: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
e8a0: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
e8b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
e8c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
e8d0: 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
e8e0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
e8f0: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
e900: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
e910: 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
e920: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
e930: 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
e940: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
e950: 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
e960: 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c  PTH==(SQLITE_N_L
e970: 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69  IMIT-1) );...  i
e980: 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
e990: 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
e9a0: 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
e9b0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
e9c0: 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
e9d0: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
e9e0: 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
e9f0: 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
ea00: 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
ea10: 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a  -52476-28732 */.
ea20: 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
ea30: 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
ea40: 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
ea50: 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
ea60: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f  mit[limitId];  /
ea70: 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32  * IMP: R-51463-2
ea80: 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  5634 */.    }.  
ea90: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
eaa0: 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
eab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
eac0: 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  ldLimit;        
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eae0: 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34  IMP: R-53341-354
eaf0: 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  19 */.}../*.** T
eb00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
eb10: 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f  used to parse bo
eb20: 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d  th URIs and non-
eb30: 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61  URI filenames pa
eb40: 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75  ssed by the.** u
eb50: 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74  ser to API funct
eb60: 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65  ions sqlite3_ope
eb70: 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  n() or sqlite3_o
eb80: 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f  pen_v2(), and fo
eb90: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52  r database.** UR
eba0: 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  Is specified as 
ebb0: 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73  part of ATTACH s
ebc0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
ebd0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
ebe0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
ebf0: 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
ec00: 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
ec10: 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c  se (or.** a NULL
ec20: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20   to signify the 
ec30: 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20  default VFS) if 
ec40: 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74  the URI does not
ec50: 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d   contain a "vfs=
ec60: 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61  xxx".** query pa
ec70: 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63  rameter. The sec
ec80: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  ond argument con
ec90: 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f  tains the URI (o
eca0: 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  r non-URI filena
ecb0: 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57  me).** itself. W
ecc0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
ecd0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  n is called the 
ece0: 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65  *pFlags variable
ecf0: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
ed00: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ** the default f
ed10: 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65  lags to open the
ed20: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
ed30: 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65   with. The value
ed40: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70   stored in.** *p
ed50: 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64  Flags may be upd
ed60: 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
ed70: 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49  rning if the URI
ed80: 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69   filename contai
ed90: 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78  ns .** "cache=xx
eda0: 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22  x" or "mode=xxx"
edb0: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
edc0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  s..**.** If succ
edd0: 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
ede0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
edf0: 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56  n this case *ppV
ee00: 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  fs is set to poi
ee10: 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53  nt to.** the VFS
ee20: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
ee30: 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
ee40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
ee50: 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74  *pzFile is set t
ee60: 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
ee70: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
ee80: 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
ee90: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20  e file to open. 
eea0: 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
eeb0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
eec0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
eed0: 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71  entually call sq
eee0: 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
eef0: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
ef00: 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  buffer..**.** If
ef10: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
ef20: 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65  , then an SQLite
ef30: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
ef40: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45  eturned and *pzE
ef50: 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20  rrMsg.** may be 
ef60: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
ef70: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
ef80: 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  ing an English l
ef90: 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a  anguage error .*
efa0: 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
efb0: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
efc0: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
efd0: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
efe0: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
eff0: 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e  buffer by callin
f000: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
f010: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f020: 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73  ParseUri(.  cons
f030: 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
f040: 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Vfs,        /* V
f050: 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20  FS to use if no 
f060: 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20  "vfs=xxx" query 
f070: 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  option */.  cons
f080: 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20  t char *zUri,   
f090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f0a0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52  ul-terminated UR
f0b0: 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20  I to parse */.  
f0c0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46  unsigned int *pF
f0d0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
f0e0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54  /* IN/OUT: SQLIT
f0f0: 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
f100: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
f110: 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20  s **ppVfs,      
f120: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46        /* OUT: VF
f130: 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63  S to use */ .  c
f140: 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20  har **pzFile,   
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f160: 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20  * OUT: Filename 
f170: 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49  component of URI
f180: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
f190: 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
f1a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
f1b0: 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20  ror message (if 
f1c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a  rc!=SQLITE_OK) *
f1d0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
f1e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
f1f0: 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20  igned int flags 
f200: 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e  = *pFlags;.  con
f210: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
f220: 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63  zDefaultVfs;.  c
f230: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
f240: 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69  ar c;.  int nUri
f250: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f260: 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73  30(zUri);..  ass
f270: 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d  ert( *pzErrMsg==
f280: 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c  0 );..  if( ((fl
f290: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
f2a0: 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74 65  N_URI) || sqlite
f2b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f  3GlobalConfig.bO
f2c0: 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20 6e  penUri) .   && n
f2d0: 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
f2e0: 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
f2f0: 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  5)==0 .  ){.    
f300: 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
f310: 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f330: 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68   Parser state wh
f340: 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a  en parsing URI *
f350: 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20  /.    int iIn;  
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
f380: 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
f390: 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
f3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f3b0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72    /* Output char
f3c0: 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
f3d0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
f3e0: 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20  Uri+2;          
f3f0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
f400: 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
f410: 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  /..    /* Make s
f420: 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f  ure the SQLITE_O
f430: 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20  PEN_URI flag is 
f440: 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20  set to indicate 
f450: 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e  to the VFS xOpen
f460: 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20   .    ** method 
f470: 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62  that there may b
f480: 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65  e extra paramete
f490: 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  rs following the
f4a0: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a   file-name.  */.
f4b0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
f4c0: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20  ITE_OPEN_URI;.. 
f4d0: 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49     for(iIn=0; iI
f4e0: 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e  n<nUri; iIn++) n
f4f0: 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49  Byte += (zUri[iI
f500: 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46  n]=='&');.    zF
f510: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
f520: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
f530: 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
f540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f550: 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  M;..    /* Disca
f560: 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e  rd the scheme an
f570: 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d  d authority segm
f580: 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e  ents of the URI.
f590: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69   */.    if( zUri
f5a0: 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69  [5]=='/' && zUri
f5b0: 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [6]=='/' ){.    
f5c0: 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20    iIn = 7;.     
f5d0: 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
f5e0: 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
f5f0: 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a 20 20  '/' ) iIn++;..  
f600: 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26      if( iIn!=7 &
f610: 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65  & (iIn!=16 || me
f620: 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22  mcmp("localhost"
f630: 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20  , &zUri[7], 9)) 
f640: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
f650: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
f660: 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
f670: 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25  uri authority: %
f680: 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
f690: 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b     iIn-7, &zUri[
f6a0: 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  7]);.        rc 
f6b0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
f6c0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
f6d0: 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
f6e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f6f0: 20 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 20 20       iIn = 5;.  
f700: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
f710: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
f720: 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61  d any query para
f730: 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  meters into the 
f740: 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20  zFile buffer. . 
f750: 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48     ** Decode %HH
f760: 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c   escape codes al
f770: 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20  ong the way. .  
f780: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68    **.    ** With
f790: 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61  in this loop, va
f7a0: 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61  riable eState ma
f7b0: 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31  y be set to 0, 1
f7c0: 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67   or 2, depending
f7d0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70  .    ** on the p
f7e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
f7f0: 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  As follows:.    
f800: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50  **.    **   0: P
f810: 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65  arsing file-name
f820: 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61  ..    **   1: Pa
f830: 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69  rsing name secti
f840: 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
f850: 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
f860: 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20  er..    **   2: 
f870: 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65  Parsing value se
f880: 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
f890: 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
f8a0: 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  meter..    */.  
f8b0: 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20    eState = 0;.  
f8c0: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
f8d0: 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
f8e0: 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  !='#' ){.      i
f8f0: 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
f900: 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26  c=='%' .       &
f910: 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  & sqlite3Isxdigi
f920: 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20  t(zUri[iIn]) .  
f930: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
f940: 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
f950: 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  +1]) .      ){. 
f960: 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74         int octet
f970: 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f   = (sqlite3HexTo
f980: 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29  Int(zUri[iIn++])
f990: 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20   << 4);.        
f9a0: 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  octet += sqlite3
f9b0: 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
f9c0: 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20  n++]);..        
f9d0: 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30  assert( octet>=0
f9e0: 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b   && octet<256 );
f9f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74  .        if( oct
fa00: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
fa10: 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
fa20: 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
fa30: 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69  "%00" appears wi
fa40: 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e  thin the URI. In
fa50: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
fa60: 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72  ** case we ignor
fa70: 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68  e all text in th
fa80: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
fa90: 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72  he path, name or
faa0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
fab0: 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  lue currently be
fac0: 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69  ing parsed. So i
fad0: 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  gnore the curren
fae0: 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20  t character.    
faf0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69        ** and ski
fb00: 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f  p to the next "?
fb10: 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61  ", "=" or "&", a
fb20: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a  s appropriate. *
fb30: 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  /.          whil
fb40: 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e  e( (c = zUri[iIn
fb50: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20  ])!=0 && c!='#' 
fb60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
fb70: 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20  & (eState!=0 || 
fb80: 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20  c!='?').        
fb90: 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
fba0: 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26  !=1 || (c!='=' &
fbb0: 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20  & c!='&')).     
fbc0: 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
fbd0: 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27  ate!=2 || c!='&'
fbe0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
fbf0: 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b             iIn++
fc00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
fc10: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
fc20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fc30: 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20      c = octet;. 
fc40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
fc50: 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d  State==1 && (c==
fc60: 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29  '&' || c=='=') )
fc70: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  {.        if( zF
fc80: 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29  ile[iOut-1]==0 )
fc90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
fca0: 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e  n empty option n
fcb0: 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73  ame. Ignore this
fcc0: 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68   option altogeth
fcd0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  er. */.         
fce0: 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
fcf0: 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
fd00: 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d  '#' && zUri[iIn-
fd10: 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b  1]!='&' ) iIn++;
fd20: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
fd30: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
fd40: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26         if( c=='&
fd50: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
fd60: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
fd70: 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  \0';.        }el
fd80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53  se{.          eS
fd90: 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  tate = 2;.      
fda0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
fdb0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
fdc0: 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26  f( (eState==0 &&
fdd0: 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74   c=='?') || (eSt
fde0: 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27  ate==2 && c=='&'
fdf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ) ){.        c =
fe00: 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61   0;.        eSta
fe10: 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  te = 1;.      }.
fe20: 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
fe30: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20  ++] = c;.    }. 
fe40: 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31     if( eState==1
fe50: 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d   ) zFile[iOut++]
fe60: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
fe70: 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
fe80: 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  ';.    zFile[iOu
fe90: 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  t++] = '\0';..  
fea0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
feb0: 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74  ere were any opt
fec0: 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74  ions specified t
fed0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  hat should be in
fee0: 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a  terpreted .    *
fef0: 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20  * here. Options 
ff00: 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72  that are interpr
ff10: 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64  eted here includ
ff20: 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73  e "vfs" and thos
ff30: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f  e that.    ** co
ff40: 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67  rrespond to flag
ff50: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61  s that may be pa
ff60: 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  ssed to the sqli
ff70: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20  te3_open_v2().  
ff80: 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a    ** method. */.
ff90: 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c      zOpt = &zFil
ffa0: 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
ffb0: 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20  0(zFile)+1];.   
ffc0: 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20   while( zOpt[0] 
ffd0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70  ){.      int nOp
ffe0: 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  t = sqlite3Strle
fff0: 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20  n30(zOpt);.     
10000 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a   char *zVal = &z
10010 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20  Opt[nOpt+1];.   
10020 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71     int nVal = sq
10030 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56  lite3Strlen30(zV
10040 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  al);..      if( 
10050 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d  nOpt==3 && memcm
10060 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33  p("vfs", zOpt, 3
10070 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10080 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20  zVfs = zVal;.   
10090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
100a0 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64    struct OpenMod
100b0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  e {.          co
100c0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
100d0 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b         int mode;
100e0 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64  .        } *aMod
100f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
10100 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d  har *zModeType =
10110 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
10120 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  mask = 0;.      
10130 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b    int limit = 0;
10140 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  ..        if( nO
10150 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28  pt==5 && memcmp(
10160 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35  "cache", zOpt, 5
10170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10180 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
10190 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d  OpenMode aCacheM
101a0 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
101b0 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22        { "shared"
101c0 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ,  SQLITE_OPEN_S
101d0 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20  HAREDCACHE },.  
101e0 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69            { "pri
101f0 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50  vate", SQLITE_OP
10200 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
10210 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
10220 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
10230 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
10240 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
10250 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53  EN_SHAREDCACHE|S
10260 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
10270 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20  TECACHE;.       
10280 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68     aMode = aCach
10290 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  eMode;.         
102a0 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20   limit = mask;. 
102b0 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
102c0 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20  pe = "cache";.  
102d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
102e0 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d  if( nOpt==4 && m
102f0 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f  emcmp("mode", zO
10300 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 4)==0 ){.   
10310 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
10320 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f  ruct OpenMode aO
10330 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  penMode[] = {.  
10340 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22            { "ro"
10350 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
10360 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20  EADONLY },.     
10370 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20         { "rw",  
10380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10390 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20  WRITE }, .      
103a0 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53        { "rwc", S
103b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
103c0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
103d0 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20  EN_CREATE },.   
103e0 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f           { "memo
103f0 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ry", SQLITE_OPEN
10400 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20  _MEMORY },.     
10410 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
10420 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
10430 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
10440 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10450 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  NLY | SQLITE_OPE
10460 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20  N_READWRITE.    
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10480 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
10490 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
104a0 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20  N_MEMORY;.      
104b0 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65      aMode = aOpe
104c0 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  nMode;.         
104d0 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20   limit = mask & 
104e0 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
104f0 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63   zModeType = "ac
10500 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d  cess";.        }
10510 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d  ..        if( aM
10520 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
10530 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
10540 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a    int mode = 0;.
10550 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
10560 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69  0; aMode[i].z; i
10570 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
10580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
10590 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20   aMode[i].z;.   
105a0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61           if( nVa
105b0 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  l==sqlite3Strlen
105c0 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63  30(z) && 0==memc
105d0 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c  mp(zVal, z, nVal
105e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
105f0 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b     mode = aMode[
10600 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  i].mode;.       
10610 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10640 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b    if( mode==0 ){
10650 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a  .            *pz
10660 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
10670 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63  _mprintf("no suc
10680 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20  h %s mode: %s", 
10690 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29  zModeType, zVal)
106a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
106b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
106c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
106d0 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
106e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
106f0 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65         if( (mode
10700 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
10710 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b  MEMORY)>limit ){
10720 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a  .            *pz
10730 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
10740 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64  _mprintf("%s mod
10750 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25  e not allowed: %
10760 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10780 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64              zMod
10790 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
107a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
107b0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
107c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
107d0 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
107e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
107f0 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73    flags = (flags
10800 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65   & ~mask) | mode
10810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10820 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20    }..      zOpt 
10830 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b  = &zVal[nVal+1];
10840 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
10850 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  .    zFile = sql
10860 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69  ite3_malloc(nUri
10870 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  +2);.    if( !zF
10880 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
10890 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d  ITE_NOMEM;.    m
108a0 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72  emcpy(zFile, zUr
108b0 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46  i, nUri);.    zF
108c0 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27  ile[nUri] = '\0'
108d0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
108e0 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
108f0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
10900 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a  _OPEN_URI;.  }..
10910 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74    *ppVfs = sqlit
10920 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
10930 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d  );.  if( *ppVfs=
10940 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =0 ){.    *pzErr
10950 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
10960 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76  rintf("no such v
10970 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
10980 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10990 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73  ERROR;.  }. pars
109a0 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28  e_uri_out:.  if(
109b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
109c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
109d0 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a  ee(zFile);.    z
109e0 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
109f0 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  *pFlags = flags;
10a00 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69  .  *pzFile = zFi
10a10 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  le;.  return rc;
10a20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
10a30 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
10a40 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67   work of opening
10a50 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62   a database on b
10a60 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69  ehalf of.** sqli
10a70 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73  te3_open() and s
10a80 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e  qlite3_open16().
10a90 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
10aa0 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d  lename "zFilenam
10ab0 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38  e"  .** is UTF-8
10ac0 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61   encoded..*/.sta
10ad0 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61  tic int openData
10ae0 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  base(.  const ch
10af0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
10b00 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
10b10 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ame UTF-8 encode
10b20 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
10b30 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a  *ppDb,        /*
10b40 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64   OUT: Returned d
10b50 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
10b60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
10b70 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70   flags,    /* Op
10b80 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20  erational flags 
10b90 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10ba0 2a 7a 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 4e  *zVfs,      /* N
10bb0 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
10bc0 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 64  o use */.  int d
10bd0 65 66 61 75 6c 74 46 6c 61 67 73 20 20 20 20 20  efaultFlags     
10be0 20 20 2f 2a 20 5a 65 72 6f 20 69 66 20 6f 70 65    /* Zero if ope
10bf0 6e 69 6e 67 20 76 69 61 20 73 71 6c 69 74 65 33  ning via sqlite3
10c00 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a 29 7b 0a 20  _open_v2 */.){. 
10c10 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61   /* Store alloca
10c40 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ted handle here 
10c50 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10c80 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ode */.  int isT
10c90 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20  hreadsafe;      
10ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
10cb0 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20   for threadsafe 
10cc0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
10cd0 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30   char *zOpen = 0
10ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10cf0 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67   /* Filename arg
10d00 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
10d10 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a   BtreeOpen() */.
10d20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
10d30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10d40 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
10d50 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50  ge from sqlite3P
10d60 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20  arseUri() */..  
10d70 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
10d80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10d90 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
10da0 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
10db0 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
10dc0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
10dd0 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  f..  /* Only all
10de0 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62  ow sensible comb
10df0 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  inations of bits
10e00 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72   in the flags ar
10e10 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54  gument.  .  ** T
10e20 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
10e30 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63   any non-sense c
10e40 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73  ombination is us
10e50 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ed.  If we.  ** 
10e60 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c  do not block ill
10e70 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  egal combination
10e80 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64  s here, it could
10e90 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73   trigger.  ** as
10ea0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
10eb0 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65  s in deeper laye
10ec0 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f  rs.  Sensible co
10ed0 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  mbinations.  ** 
10ee0 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  are:.  **.  **  
10ef0 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  1:  SQLITE_OPEN_
10f00 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32  READONLY.  **  2
10f10 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
10f20 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36  EADWRITE.  **  6
10f30 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
10f40 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
10f50 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20  E_OPEN_CREATE.  
10f60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
10f70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
10f80 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20  Y  == 0x01 );.  
10f90 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
10fa0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d  PEN_READWRITE ==
10fb0 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72   0x02 );.  asser
10fc0 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  t( SQLITE_OPEN_C
10fd0 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34  REATE    == 0x04
10fe0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
10ff0 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
11000 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f  0x02 ); /* READO
11010 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  NLY */.  testcas
11020 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
11030 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45  )==0x04 ); /* RE
11040 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73  ADWRITE */.  tes
11050 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
11060 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f  s&7))==0x40 ); /
11070 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52  * READWRITE | CR
11080 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28  EATE */.  if( ((
11090 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20  1<<(flags&7)) & 
110a0 30 78 34 36 29 3d 3d 30 20 29 20 72 65 74 75 72  0x46)==0 ) retur
110b0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
110c0 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c  BKPT;..  if( sql
110d0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
110e0 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29  .bCoreMutex==0 )
110f0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
11100 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
11110 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
11120 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
11130 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
11140 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
11150 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
11160 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
11170 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
11180 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65  adsafe = 1;.  }e
11190 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61  lse{.    isThrea
111a0 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47  dsafe = sqlite3G
111b0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
111c0 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66  lMutex;.  }.  if
111d0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
111e0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
111f0 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  HE ){.    flags 
11200 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
11210 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
11220 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
11230 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
11240 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
11250 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
11260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
11270 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
11280 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75  /* Remove harmfu
11290 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  l bits from the 
112a0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
112b0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
112c0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
112d0 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45  X and SQLITE_OPE
112e0 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67  N_FULLMUTEX flag
112f0 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c  s were.  ** deal
11300 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72  t with in the pr
11310 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63  evious code bloc
11320 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73  k.  Besides thes
11330 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a  e, the only.  **
11340 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61   valid input fla
11350 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f  gs for sqlite3_o
11360 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c  pen_v2() are SQL
11370 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
11380 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  Y,.  ** SQLITE_O
11390 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53  PEN_READWRITE, S
113a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
113b0 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  E, SQLITE_OPEN_S
113c0 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a  HAREDCACHE,.  **
113d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
113e0 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73  VATECACHE, and s
113f0 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74  ome reserved bit
11400 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  s.  Silently mas
11410 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
11420 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
11430 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
11440 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
11450 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
11460 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11470 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
11480 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
11490 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
114a0 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
114b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
114c0 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
114e0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
114f0 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
11500 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11510 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
11520 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
11530 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
11540 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11560 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
11570 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
11580 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
11590 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
115a0 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
115b0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
115c0 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
115d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
115e0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a  PEN_FULLMUTEX |.
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11600 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
11610 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a              );..
11620 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 67    /* Check for g
11630 6c 6f 62 61 6c 20 72 65 61 64 2d 6f 6e 6c 79 20  lobal read-only 
11640 6d 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 73 71  mode */.  if( sq
11650 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
11660 67 2e 62 52 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  g.bReadOnly ){. 
11670 20 20 20 69 66 28 20 64 65 66 61 75 6c 74 46 6c     if( defaultFl
11680 61 67 73 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  ags ){.      fla
11690 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f  gs &= ~(SQLITE_O
116a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
116b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
116c0 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  );.      flags |
116d0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
116e0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 65 6c 73  ADONLY;.    }els
116f0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
11700 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11710 49 54 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ITE ){.      ret
11720 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11730 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  NLY;.    }.  }..
11740 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
11750 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74  e sqlite data st
11760 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20  ructure */.  db 
11770 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
11780 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69  ero( sizeof(sqli
11790 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62  te3) );.  if( db
117a0 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64  ==0 ) goto opend
117b0 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54  b_out;.  if( isT
117c0 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20  hreadsafe ){.   
117d0 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c   db->mutex = sql
117e0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
117f0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
11800 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  RSIVE);.    if( 
11810 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  db->mutex==0 ){.
11820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11830 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62  ee(db);.      db
11840 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
11850 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
11860 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11870 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11880 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
11890 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20  rrMask = 0xff;. 
118a0 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
118b0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
118c0 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
118d0 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
118e0 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73  DbStatic;..  ass
118f0 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
11900 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
11910 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
11920 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
11930 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
11940 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
11950 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  t));.  db->autoC
11960 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
11970 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
11980 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  1;.  db->nextPag
11990 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
119a0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
119b0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c  _ShortColNames |
119c0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
119d0 78 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  x | SQLITE_Enabl
119e0 65 54 72 69 67 67 65 72 0a 23 69 66 20 53 51 4c  eTrigger.#if SQL
119f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
11a00 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20  _FORMAT<4.      
11a10 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
11a20 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
11a30 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  t.#endif.#ifdef 
11a40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11a50 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
11a70 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
11a80 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20  sion.#endif.#if 
11a90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
11aa0 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52  ECURSIVE_TRIGGER
11ab0 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S.              
11ac0 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54     | SQLITE_RecT
11ad0 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23  riggers.#endif.#
11ae0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
11af0 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
11b00 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54  N_KEYS) && SQLIT
11b10 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
11b20 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20  N_KEYS.         
11b30 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
11b40 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e  _ForeignKeys.#en
11b50 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
11b60 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
11b70 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
11b80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11b90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
11ba0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
11bb0 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
11bc0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
11bd0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
11be0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
11bf0 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
11c00 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
11c10 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
11c20 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
11c30 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
11c40 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
11c50 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
11c60 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
11c70 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
11c80 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
11c90 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
11ca0 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74  re..  */.  creat
11cb0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
11cc0 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
11cd0 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  UTF8, 0, binColl
11ce0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
11cf0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
11d00 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
11d10 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e  _UTF16BE, 0, bin
11d20 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
11d30 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
11d40 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
11d50 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c  LITE_UTF16LE, 0,
11d60 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
11d70 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
11d80 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
11d90 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
11da0 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46  oid*)1, binCollF
11db0 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
11dc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11dd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
11de0 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62  db_out;.  }.  db
11df0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71  ->pDfltColl = sq
11e00 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
11e10 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
11e20 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a  , "BINARY", 0);.
11e30 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44    assert( db->pD
11e40 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20  fltColl!=0 );.. 
11e50 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55   /* Also add a U
11e60 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73  TF-8 case-insens
11e70 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  itive collation 
11e80 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63  sequence. */.  c
11e90 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
11ea0 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c  b, "NOCASE", SQL
11eb0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63  ITE_UTF8, 0, noc
11ec0 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
11ed0 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73  , 0);..  /* Pars
11ee0 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55  e the filename/U
11ef0 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a  RI argument. */.
11f00 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20    db->openFlags 
11f10 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20  = flags;.  rc = 
11f20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
11f30 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  zVfs, zFilename,
11f40 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56   &flags, &db->pV
11f50 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72  fs, &zOpen, &zEr
11f60 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21  rMsg);.  if( rc!
11f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11f80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f90 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c  _NOMEM ) db->mal
11fa0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
11fb0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
11fc0 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20  db, rc, zErrMsg 
11fd0 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72  ? "%s" : 0, zErr
11fe0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
11ff0 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
12000 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
12010 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
12020 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64  Open the backend
12030 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72   database driver
12040 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
12050 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e  e3BtreeOpen(db->
12060 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c  pVfs, zOpen, db,
12070 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74   &db->aDb[0].pBt
12080 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61               fla
120a0 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs | SQLITE_OPEN
120b0 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28  _MAIN_DB);.  if(
120c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
120d0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
120e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
120f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12100 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12110 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
12120 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
12130 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
12140 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61  out;.  }.  db->a
12150 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
12160 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
12170 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
12180 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
12190 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  1].pSchema = sql
121a0 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
121b0 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65  , 0);...  /* The
121c0 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f   default safety_
121d0 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61  level for the ma
121e0 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27  in database is '
121f0 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74  full'; for the t
12200 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  emp.  ** databas
12210 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20  e it is 'NONE'. 
12220 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
12230 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66   pager layer def
12240 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  aults.  .  */.  
12250 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65  db->aDb[0].zName
12260 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d   = "main";.  db-
12270 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[0].safety_l
12280 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e  evel = 3;.  db->
12290 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[1].zName = "
122a0 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62  temp";.  db->aDb
122b0 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [1].safety_level
122c0 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67   = 1;..  db->mag
122d0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
122e0 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62  C_OPEN;.  if( db
122f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12300 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
12310 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
12320 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75   Register all bu
12330 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
12340 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74  , but do not att
12350 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65  empt to read the
12360 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73  .  ** database s
12370 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20  chema yet. This 
12380 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
12390 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
123a0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
123b0 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20  * is accessed.. 
123c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72   */.  sqlite3Err
123d0 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
123e0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  , 0);.  sqlite3R
123f0 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
12400 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20  nctions(db);..  
12410 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69  /* Load automati
12420 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65  c extensions - e
12430 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68  xtensions that h
12440 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65  ave been registe
12450 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  red.  ** using t
12460 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d  he sqlite3_autom
12470 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29  atic_extension()
12480 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20   API..  */.  rc 
12490 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
124a0 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d  e(db);.  if( rc=
124b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
124c0 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61    sqlite3AutoLoa
124d0 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  dExtensions(db);
124e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
124f0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
12500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
12520 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
12530 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
12540 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
12550 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
12560 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12570 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
12580 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
12590 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
125a0 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
125b0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
125c0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
125d0 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
125e0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
125f0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
12600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
12610 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
12620 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
12630 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12640 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
12650 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
12660 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12670 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62  E_FTS3.  if( !db
12680 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
12690 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
126a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
126b0 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b  te3Fts3Init(db);
126c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
126d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
126e0 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d  E_ICU.  if( !db-
126f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
12700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12710 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12720 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
12730 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
12740 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12750 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
12760 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
12770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
12780 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12790 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
127a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
127b0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
127c0 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53  c, 0);..  /* -DS
127d0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
127e0 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
127f0 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
12800 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
12810 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
12820 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
12830 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
12840 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
12850 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
12860 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
12870 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
12880 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
12890 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
128a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
128b0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
128c0 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
128d0 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
128e0 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
128f0 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
12900 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
12910 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
12920 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
12930 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
12940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
12950 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
12960 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
12970 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  if..  /* Enable 
12980 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
12990 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
129a0 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
129b0 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
129c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
129d0 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
12a00 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
12a10 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77  e);..  sqlite3_w
12a20 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
12a30 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46  t(db, SQLITE_DEF
12a40 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45  AULT_WAL_AUTOCHE
12a50 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64  CKPOINT);..opend
12a60 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  b_out:.  sqlite3
12a70 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20  _free(zOpen);.  
12a80 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73  if( db ){.    as
12a90 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21  sert( db->mutex!
12aa0 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61  =0 || isThreadsa
12ab0 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  fe==0 || sqlite3
12ac0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
12ad0 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20  llMutex==0 );.  
12ae0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12af0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12b00 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
12b10 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
12b20 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
12b30 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
12b40 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72  NOMEM );.  if( r
12b50 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
12b60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
12b70 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62  lose(db);.    db
12b80 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
12b90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12ba0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
12bb0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
12bc0 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  SICK;.  }.  *ppD
12bd0 62 20 3d 20 64 62 3b 0a 20 20 72 65 74 75 72 6e  b = db;.  return
12be0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
12bf0 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  0, rc);.}../*.**
12c00 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
12c10 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
12c20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
12c30 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
12c40 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
12c50 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
12c60 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
12c70 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
12c80 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
12ca0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12cb0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
12cc0 4e 5f 43 52 45 41 54 45 2c 20 30 2c 20 31 29 3b  N_CREATE, 0, 1);
12cd0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
12ce0 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
12cf0 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
12d00 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
12d10 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
12d20 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
12d30 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
12d40 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
12d50 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
12d60 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
12d70 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
12d80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
12d90 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
12da0 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
12db0 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
12dc0 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
12dd0 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
12de0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
12df0 6c 61 67 73 2c 20 7a 56 66 73 2c 20 30 29 3b 0a  lags, zVfs, 0);.
12e00 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12e10 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
12e20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
12e30 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
12e40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
12e50 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f  en16(.  const vo
12e60 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  id *zFilename, .
12e70 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
12e80 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
12e90 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20   *zFilename8;   
12ea0 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63  /* zFilename enc
12eb0 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e  oded in UTF-8 in
12ec0 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20  stead of UTF-16 
12ed0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
12ee0 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
12ef0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a  rc;..  assert( z
12f00 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73  Filename );.  as
12f10 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20  sert( ppDb );.  
12f20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
12f30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12f40 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
12f50 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
12f60 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
12f70 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
12f80 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  f.  pVal = sqlit
12f90 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
12fa0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12fb0 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
12fc0 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
12fd0 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
12fe0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
12ff0 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
13000 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
13010 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
13020 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
13030 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
13040 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
13050 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13070 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
13080 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
13090 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
130a0 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
130b0 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
130c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
130d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
130e0 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
130f0 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
13100 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
13110 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a  ) ){.      ENC(*
13120 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
13130 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
13140 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
13150 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13160 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13170 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
13180 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
13190 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
131a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
131b0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
131c0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
131d0 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
131e0 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
131f0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
13200 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
13210 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
13220 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
13230 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
13240 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
13250 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
13260 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
13270 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
13280 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
13290 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
132a0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
132b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
132c0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
132d0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
132e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
132f0 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
13300 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
13310 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
13320 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20  xCompare, 0);.  
13330 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
13340 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
13350 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13360 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
13370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13380 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
13390 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
133a0 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
133b0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
133c0 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
133d0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
133e0 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
133f0 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
13400 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
13410 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
13420 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
13430 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
13440 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
13450 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
13460 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
13470 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
13480 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
13490 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
134a0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
134b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
134c0 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
134d0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
134e0 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70  Name, (u8)enc, p
134f0 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78  Ctx, xCompare, x
13500 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Del);.  rc = sql
13510 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
13520 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
13530 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
13540 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
13550 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
13560 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
13570 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
13580 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
13590 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
135a0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
135b0 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
135c0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
135d0 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ation16(.  sqlit
135e0 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
135f0 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20   void *zName,.  
13600 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
13610 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
13620 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
13630 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
13640 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
13650 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
13670 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74  *zName8;.  sqlit
13680 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
13690 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
136a0 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
136b0 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d  Failed );.  zNam
136c0 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  e8 = sqlite3Utf1
136d0 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  6to8(db, zName, 
136e0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
136f0 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a  NATIVE);.  if( z
13700 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  Name8 ){.    rc 
13710 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
13720 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75  n(db, zName8, (u
13730 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
13740 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
13750 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
13760 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20   zName8);.  }.  
13770 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
13780 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
13790 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
137a0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
137b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
137c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
137d0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
137e0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
137f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13800 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
13810 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
13820 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
13830 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
13840 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
13850 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
13860 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
13870 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
13880 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
13890 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
138a0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
138b0 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
138c0 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
138d0 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
138e0 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
138f0 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c   char*).){.  sql
13900 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13910 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
13920 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
13930 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
13940 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
13950 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
13960 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
13970 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
13980 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13990 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
139a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139b0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
139c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
139d0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
139e0 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
139f0 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
13a00 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
13a10 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
13a20 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
13a30 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
13a40 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
13a50 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
13a60 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
13a70 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
13a80 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
13a90 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
13aa0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
13ab0 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
13ac0 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
13ad0 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
13ae0 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
13af0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
13b00 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
13b10 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
13b20 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
13b30 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
13b40 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
13b50 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
13b60 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
13b70 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
13b80 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
13b90 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
13ba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
13bb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13bc0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
13bd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13be0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
13bf0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13c00 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
13c10 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
13c20 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
13c30 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
13c40 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
13c50 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
13c60 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
13c70 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
13c80 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
13c90 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
13ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13cb0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
13cc0 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
13cd0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
13ce0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
13cf0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
13d00 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
13d10 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
13d20 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
13d30 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
13d40 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
13d50 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
13d60 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
13d70 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
13d80 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
13d90 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
13da0 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
13db0 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a  or ROLLBACK..**.
13dc0 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20  ******* THIS IS 
13dd0 41 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20  AN EXPERIMENTAL 
13de0 41 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45  API AND IS SUBJE
13df0 43 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a  CT TO CHANGE ***
13e00 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ***.*/.int sqlit
13e10 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
13e20 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
13e30 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
13e40 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
13e50 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13e60 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
13e70 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
13e80 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
13e90 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
13ea0 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
13eb0 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
13ec0 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
13ed0 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
13ee0 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
13ef0 65 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75  ey server two pu
13f00 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
13f10 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
13f20 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
13f30 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
13f40 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
13f50 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
13f60 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
13f70 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
13f80 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
13f90 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
13fa0 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
13fb0 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
13fc0 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
13fd0 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
13fe0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
13ff0 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
14000 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14010 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
14020 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
14030 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
14040 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
14050 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
14060 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
14070 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
14080 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
14090 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
140a0 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
140c0 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
140d0 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
140e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
140f0 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
14100 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
14110 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
14120 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
14130 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
14140 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
14150 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
14160 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
14170 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
14180 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
14190 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
141a0 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
141b0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
141c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
141d0 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
141e0 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
141f0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
14200 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
14210 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14220 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
14230 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
14240 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
14250 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
14260 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
14270 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
14280 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
14290 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
142a0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
142b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
142c0 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
142d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
142e0 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
142f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
14300 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
14310 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
14320 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
14330 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
14340 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
14350 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
14360 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
14370 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
14380 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
14390 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
143a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
143b0 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
143c0 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
143d0 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
143e0 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
143f0 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
14400 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
14410 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
14420 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
14430 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
14440 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
14450 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
14460 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
14470 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
14480 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
14490 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
144a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
144b0 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
144c0 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74  TADATA.int sqlit
144d0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
144e0 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
144f0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
14500 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
14510 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
14520 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
14530 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
14540 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
14550 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
14560 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
14570 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
14580 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
14590 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
145a0 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
145b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
145c0 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
145d0 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
145e0 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
145f0 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
14600 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
14610 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
14620 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
14630 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
14640 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
14650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
14660 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
14670 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
14680 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
14690 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
146a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
146b0 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
146c0 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
146d0 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146f0 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
14700 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
14710 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
14720 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
14730 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
14740 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
14750 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
14760 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
14770 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  l;..  char const
14780 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
14790 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
147a0 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
147b0 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
147c0 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
147d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
147e0 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
147f0 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
14800 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
14810 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
14820 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14830 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
14840 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14850 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
14860 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
14870 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
14880 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
14890 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
148a0 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
148b0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
148c0 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
148d0 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
148e0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
148f0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
14900 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
14910 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
14920 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
14930 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
14940 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
14950 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
14960 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
14970 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
14980 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
14990 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
149a0 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
149b0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
149c0 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
149d0 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
149e0 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
149f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
14a00 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
14a10 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
14a20 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
14a30 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
14a40 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
14a50 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
14a60 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
14a70 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
14a80 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
14a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14aa0 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
14ab0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
14ac0 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
14ad0 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
14ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14af0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
14b00 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
14b10 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
14b20 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
14b30 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
14b40 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
14b50 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
14b60 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
14b70 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
14b80 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
14b90 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
14ba0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
14bb0 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
14bc0 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
14bd0 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
14be0 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
14bf0 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
14c00 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
14c10 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
14c20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
14c30 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
14c40 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
14c50 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
14c60 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
14c70 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
14c80 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
14c90 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
14ca0 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
14cb0 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
14cc0 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
14cd0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
14ce0 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
14cf0 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
14d00 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
14d10 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
14d20 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
14d30 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
14d40 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
14d50 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
14d60 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65  = pCol->isPrimKe
14d70 79 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  y!=0;.    autoin
14d80 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
14d90 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
14da0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
14db0 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
14dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
14dd0 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
14de0 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
14df0 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
14e00 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
14e10 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22      zCollSeq = "
14e20 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72  BINARY";.  }..er
14e30 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
14e40 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
14e50 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
14e60 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
14e70 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
14e80 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
14e90 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
14ea0 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
14eb0 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
14ec0 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
14ed0 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
14ee0 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
14ef0 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
14f00 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
14f10 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
14f20 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
14f30 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
14f40 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
14f50 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
14f60 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
14f70 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
14f80 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
14f90 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
14fa0 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
14fb0 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
14fc0 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
14fd0 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
14fe0 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
14ff0 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
15000 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
15010 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
15020 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15030 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
15040 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
15050 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
15060 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
15070 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
15080 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
15090 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
150a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
150b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
150c0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
150d0 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
150e0 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
150f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15100 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
15110 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
15120 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
15130 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15140 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
15150 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
15160 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  dif../*.** Sleep
15170 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
15180 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
15190 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
151a0 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  slept..*/.int sq
151b0 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20  lite3_sleep(int 
151c0 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ms){.  sqlite3_v
151d0 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20  fs *pVfs;.  int 
151e0 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c  rc;.  pVfs = sql
151f0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
15200 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20  ;.  if( pVfs==0 
15210 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
15220 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15230 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65  works in millise
15240 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75  conds, but the u
15250 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65  nderlying OsSlee
15260 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73  p() .  ** API us
15270 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  es microseconds.
15280 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27   Hence the 1000'
15290 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28  s..  */.  rc = (
152a0 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70  sqlite3OsSleep(p
152b0 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30  Vfs, 1000*ms)/10
152c0 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  00);.  return rc
152d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
152e0 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
152f0 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74   extended result
15300 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   codes..*/.int s
15310 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
15320 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c  result_codes(sql
15330 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e  ite3 *db, int on
15340 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  off){.  sqlite3_
15350 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
15360 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
15370 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
15380 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
15390 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
153a0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
153b0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
153c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
153d0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
153e0 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
153f0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
15400 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
15410 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
15420 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
15430 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
15440 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
15450 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
15460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15470 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a  ERROR;.  Btree *
15480 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74  pBtree;..  sqlit
15490 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
154a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
154b0 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
154c0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
154d0 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
154e0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
154f0 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
15500 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
15510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
15520 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
15530 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
15540 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
15550 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
15560 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
15570 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
15580 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
15590 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
155a0 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
155b0 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
155c0 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
155d0 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
155e0 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
155f0 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
15600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15610 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65  else if( fd->pMe
15620 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72  thods ){.      r
15630 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
15640 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
15650 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73   pArg);.    }els
15660 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
15670 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
15680 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15690 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
156a0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
156b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
156c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
156d0 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a  rn rc;   .}../*.
156e0 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
156f0 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
15700 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
15710 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
15720 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
15730 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64  nt rc = 0;.#ifnd
15740 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
15750 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61  UILTIN_TEST.  va
15760 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
15770 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
15780 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
15790 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76     /*.    ** Sav
157a0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  e the current st
157b0 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e  ate of the PRNG.
157c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
157d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
157e0 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20  _PRNG_SAVE: {.  
157f0 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53      sqlite3PrngS
15800 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  aveState();.    
15810 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15820 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
15830 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20  store the state 
15840 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  of the PRNG to t
15850 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61  he last state sa
15860 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ved using.    **
15870 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20   PRNG_SAVE.  If 
15880 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65  PRNG_SAVE has ne
15890 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
158a0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  called, then.   
158b0 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63   ** this verb ac
158c0 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53  ts like PRNG_RES
158d0 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ET..    */.    c
158e0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
158f0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
15900 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
15910 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74  3PrngRestoreStat
15920 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
15930 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
15940 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65      ** Reset the
15950 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74   PRNG back to it
15960 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
15970 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74  state.  The next
15980 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
15990 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
159a0 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64  ss() will reseed
159b0 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20   the PRNG using 
159c0 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20  a single call.  
159d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e    ** to the xRan
159e0 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f  domness method o
159f0 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  f the default VF
15a00 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  S..    */.    ca
15a10 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
15a20 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b  RL_PRNG_RESET: {
15a30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
15a40 6e 67 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a  ngResetState();.
15a50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15a60 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
15a70 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
15a80 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54  control(BITVEC_T
15a90 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72  EST, size, progr
15aa0 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  am).    **.    *
15ab0 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61  * Run a test aga
15ac0 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62  inst a Bitvec ob
15ad0 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54  ject of size.  T
15ae0 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d  he program argum
15af0 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e  ent.    ** is an
15b00 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
15b10 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  rs that defines 
15b20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72  the test.  Retur
15b30 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a  n -1 on a.    **
15b40 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
15b50 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73  on error, 0 on s
15b60 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a  uccess, or non-z
15b70 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72  ero for an error
15b80 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65  ..    ** See the
15b90 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
15ba0 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20  iltinTest() for 
15bb0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
15bc0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
15bd0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
15be0 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
15bf0 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EST: {.      int
15c00 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
15c10 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
15c20 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67   *aProg = va_arg
15c30 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
15c40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
15c50 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
15c60 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20  sz, aProg);.    
15c70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15c80 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
15c90 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
15ca0 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
15cb0 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
15cc0 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
15cd0 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
15ce0 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
15cf0 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
15d00 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
15d10 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
15d20 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
15d30 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
15d40 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
15d50 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
15d60 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
15d70 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
15d80 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
15d90 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
15da0 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
15db0 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
15dc0 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
15dd0 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
15de0 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
15df0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
15e00 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
15e10 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
15e20 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
15e30 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
15e40 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
15e50 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
15e60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e70 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
15e80 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
15e90 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
15ea0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
15eb0 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
15ec0 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
15ed0 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
15ee0 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
15ef0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
15f00 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
15f10 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
15f20 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
15f30 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
15f40 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
15f50 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
15f60 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
15f70 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
15f80 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
15f90 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
15fa0 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
15fb0 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
15fc0 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
15fd0 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
15fe0 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
15ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
16000 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
16010 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
16020 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
16030 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
16040 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
16050 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
16060 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
16070 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  ileterious behav
16080 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
16090 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
160a0 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
160b0 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
160c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
160d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
160e0 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
160f0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
16100 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
16110 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
16120 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
16130 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
16140 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
16150 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
16160 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
16170 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
16180 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
16190 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
161a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
161b0 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
161c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
161d0 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
161e0 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
161f0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
16200 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
16210 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
16220 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
16230 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
16240 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
16250 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
16260 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
16270 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
16280 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
16290 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
162a0 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
162b0 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
162c0 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
162d0 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
162e0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
162f0 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
16300 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
16310 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
16320 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
16330 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
16340 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
16350 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
16360 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
16370 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
16380 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
16390 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
163a0 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
163b0 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
163c0 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
163d0 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61  ssert( (x = va_a
163e0 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
163f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
16400 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16410 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
16420 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
16430 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
16440 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
16450 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
16460 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
16470 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
16480 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
16490 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
164a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
164b0 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
164c0 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
164d0 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
164e0 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
164f0 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
16500 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
16510 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
16520 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
16530 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
16540 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
16550 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
16560 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
16570 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
16580 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
16590 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
165a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
165b0 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
165c0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
165d0 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
165e0 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
165f0 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
16600 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
16610 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
16620 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
16630 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
16640 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
16650 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
16660 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
16670 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
16680 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
16690 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
166a0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
166b0 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
166c0 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
166d0 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
166e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
166f0 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
16700 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
16710 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
16720 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
16730 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
16740 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
16750 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
16760 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
16770 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
16780 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
16790 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
167a0 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
167b0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
167c0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
167d0 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
167e0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
167f0 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
16800 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
16810 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
16820 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
16830 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
16840 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
16850 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
16860 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
16870 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
16880 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
16890 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
168a0 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
168b0 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
168c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
168d0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
168e0 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
168f0 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
16900 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
16910 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
16920 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
16930 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
16940 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
16950 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
16960 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
16970 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
16980 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
16990 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
169a0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
169b0 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
169c0 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
169d0 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
169e0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
169f0 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
16a00 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
16a10 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
16a20 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
16a30 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
16a40 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
16a50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
16a60 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
16a70 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
16a80 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
16a90 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
16aa0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
16ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
16ac0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
16ad0 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
16ae0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
16af0 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
16b00 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
16b10 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
16b20 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
16b30 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
16b40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
16b50 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
16b60 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
16b70 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
16b80 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
16b90 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
16ba0 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
16bb0 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
16bc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
16bd0 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
16be0 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
16bf0 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
16c00 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
16c10 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
16c20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
16c30 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
16c40 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
16c50 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
16c60 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
16c70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
16c80 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
16c90 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
16ca0 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
16cb0 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
16cc0 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
16cd0 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
16ce0 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
16cf0 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
16d00 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
16d10 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
16d20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
16d30 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
16d40 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
16d50 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
16d60 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
16d70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
16d80 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
16d90 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
16da0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
16db0 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  t);.      db->fl
16dc0 61 67 73 20 3d 20 28 78 20 26 20 53 51 4c 49 54  ags = (x & SQLIT
16dd0 45 5f 4f 70 74 4d 61 73 6b 29 20 7c 20 28 64 62  E_OptMask) | (db
16de0 2d 3e 66 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  ->flags & ~SQLIT
16df0 45 5f 4f 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20  E_OptMask);.    
16e00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
16e10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f  #ifdef SQLITE_N_
16e20 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73  KEYWORD.    /* s
16e30 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
16e40 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
16e50 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63  TRL_ISKEYWORD, c
16e60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
16e70 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
16e80 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65  If zWord is a ke
16e90 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64  yword recognized
16ea0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20   by the parser, 
16eb0 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
16ec0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
16ed0 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69   keywords.  Or i
16ee0 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61  f zWord is not a
16ef0 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e   keyword, return
16f00 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20   0..    ** .    
16f10 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61  ** This test fea
16f20 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  ture is only ava
16f30 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d  ilable in the am
16f40 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65  algamation since
16f50 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  .    ** the SQLI
16f60 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63  TE_N_KEYWORD mac
16f70 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ro is not define
16f80 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69  d in this file i
16f90 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20  f SQLite.    ** 
16fa0 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73  is built using s
16fb0 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66  eparate source f
16fc0 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
16fd0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
16fe0 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a  TCTRL_ISKEYWORD:
16ff0 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
17000 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f  har *zWord = va_
17010 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
17020 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ar*);.      int 
17030 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
17040 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20  n30(zWord);.    
17050 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b    rc = (sqlite3K
17060 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29  eywordCode((u8*)
17070 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44  zWord, n)!=TK_ID
17080 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  ) ? SQLITE_N_KEY
17090 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20  WORD : 0;.      
170a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
170b0 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c  dif ..    /* sql
170c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
170d0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
170e0 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c  L_SCRATCHMALLOC,
170f0 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65   sz, &pNew, pFre
17100 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e);.    **.    *
17110 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e 74  * Pass pFree int
17120 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  o sqlite3Scratch
17130 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20  Free(). .    ** 
17140 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c  If sz>0 then all
17150 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68 20  ocate a scratch 
17160 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77  buffer into pNew
17170 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .  .    */.    c
17180 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
17190 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
171a0 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  C: {.      void 
171b0 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b  *pFree, **ppNew;
171c0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
171d0 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67       sz = va_arg
171e0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
171f0 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28   ppNew = va_arg(
17200 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20  ap, void**);.   
17210 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72     pFree = va_ar
17220 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
17230 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70      if( sz ) *pp
17240 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72  New = sqlite3Scr
17250 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a  atchMalloc(sz);.
17260 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 72        sqlite3Scr
17270 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29 3b  atchFree(pFree);
17280 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17290 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
172a0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
172b0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
172c0 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
172d0 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a  LT, int onoff);.
172e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
172f0 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66   parameter onoff
17300 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f   is non-zero, co
17310 6e 66 69 67 75 72 65 20 74 68 65 20 77 72 61 70  nfigure the wrap
17320 70 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  pers so that all
17330 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65  .    ** subseque
17340 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61  nt calls to loca
17350 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69  ltime() and vari
17360 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e  ants fail. If on
17370 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20  off is zero,.   
17380 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65   ** undo this se
17390 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tting..    */.  
173a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
173b0 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
173c0 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20  _FAULT: {.      
173d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
173e0 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61  fig.bLocaltimeFa
173f0 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ult = va_arg(ap,
17400 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
17410 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
17420 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
17430 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
17440 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  N).    /*   sqli
17450 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
17460 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
17470 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 2c 0a 20  _EXPLAIN_STMT,. 
17480 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
17490 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
174a0 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f 6e 73 74  ite3_stmt*,const
174b0 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 2a 2a   char**);.    **
174c0 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f 6d 70 69  .    ** If compi
174d0 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
174e0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
174f0 41 49 4e 2c 20 65 61 63 68 20 73 71 6c 69 74 65  AIN, each sqlite
17500 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a 20 20 20  3_stmt holds.   
17510 20 2a 2a 20 61 20 73 74 72 69 6e 67 20 74 68 61   ** a string tha
17520 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
17530 6f 70 74 69 6d 69 7a 65 64 20 70 61 72 73 65 20  optimized parse 
17540 74 72 65 65 2e 20 20 54 68 69 73 20 74 65 73 74  tree.  This test
17550 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20 2a 2a 20  -control.    ** 
17560 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
17570 72 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67  r to that string
17580 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17590 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
175a0 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 3a 20  L_EXPLAIN_STMT: 
175b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
175c0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 76 61  stmt *pStmt = va
175d0 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
175e0 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20 20 20 63  _stmt*);.      c
175f0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 52 65  onst char **pzRe
17600 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  t = va_arg(ap, c
17610 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20  onst char**);.  
17620 20 20 20 20 2a 70 7a 52 65 74 20 3d 20 73 71 6c      *pzRet = sql
17630 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74  ite3VdbeExplanat
17640 69 6f 6e 28 28 56 64 62 65 2a 29 70 53 74 6d 74  ion((Vdbe*)pStmt
17650 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17660 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
17670 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
17680 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17690 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
176a0 53 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  ST */.  return r
176b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
176c0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f   is a utility ro
176d0 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f  utine, useful to
176e0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
176f0 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b  ions, that check
17700 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61  s.** to see if a
17710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
17720 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f  as a URI that co
17730 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66  ntained a specif
17740 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72  ic query .** par
17750 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73  ameter, and if s
17760 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61  o obtains the va
17770 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79  lue of the query
17780 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
17790 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
177a0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
177b0 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72  filename pointer
177c0 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65   passed into the
177d0 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68   xOpen().** meth
177e0 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c  od of a VFS impl
177f0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
17800 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74   zParam argument
17810 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
17820 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  the.** query par
17830 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20  ameter we seek. 
17840 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
17850 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
17860 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a  of the zParam.**
17870 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74   parameter if it
17880 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65   exists.  If the
17890 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20   parameter does 
178a0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
178b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
178c0 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ns a NULL pointe
178d0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
178e0 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61   *sqlite3_uri_pa
178f0 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68  rameter(const ch
17900 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
17910 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
17920 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  m){.  if( zFilen
17930 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
17940 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  0;.  zFilename +
17950 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17960 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
17970 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65  ;.  while( zFile
17980 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
17990 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46  nt x = strcmp(zF
179a0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
179b0 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
179c0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
179d0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
179e0 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20  1;.    if( x==0 
179f0 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61  ) return zFilena
17a00 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  me;.    zFilenam
17a10 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
17a20 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
17a30 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  + 1;.  }.  retur
17a40 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
17a50 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76  turn a boolean v
17a60 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
17a70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
17a80 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  nt sqlite3_uri_b
17a90 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61  oolean(const cha
17aa0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
17ab0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
17ac0 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20  , int bDflt){.  
17ad0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
17ae0 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
17af0 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
17b00 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c   zParam);.  bDfl
17b10 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20  t = bDflt!=0;.  
17b20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74  return z ? sqlit
17b30 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20  e3GetBoolean(z, 
17b40 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a  bDflt) : bDflt;.
17b50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17b60 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
17b70 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
17b80 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
17b90 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
17ba0 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34  qlite3_uri_int64
17bb0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
17bc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  zFilename,    /*
17bd0 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73   Filename as pas
17be0 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a  sed to xOpen */.
17bf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
17c00 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55  aram,       /* U
17c10 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75  RI parameter sou
17c20 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ght */.  sqlite3
17c30 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20  _int64 bDflt    
17c40 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20     /* return if 
17c50 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73  parameter is mis
17c60 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  sing */.){.  con
17c70 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
17c80 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
17c90 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
17ca0 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  aram);.  sqlite3
17cb0 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20  _int64 v;.  if( 
17cc0 7a 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f 69  z && sqlite3Atoi
17cd0 36 34 28 7a 2c 20 26 76 2c 20 73 71 6c 69 74 65  64(z, &v, sqlite
17ce0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
17cf0 4c 49 54 45 5f 55 54 46 38 29 3d 3d 53 51 4c 49  LITE_UTF8)==SQLI
17d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66  TE_OK ){.    bDf
17d10 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  lt = v;.  }.  re
17d20 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  turn bDflt;.}../
17d30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17d40 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64  Btree pointer id
17d50 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e  entified by zDbN
17d60 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ame.  Return NUL
17d70 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
17d80 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65  */.Btree *sqlite
17d90 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73  3DbNameToBtree(s
17da0 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
17db0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
17dc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
17dd0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
17de0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
17df0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20  b->aDb[i].pBt.  
17e00 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d     && (zDbName==
17e10 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
17e20 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d  Cmp(zDbName, db-
17e30 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  >aDb[i].zName)==
17e40 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
17e50 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69  return db->aDb[i
17e60 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ].pBt;.    }.  }
17e70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
17e80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17e90 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
17ea0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
17eb0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
17ec0 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
17ed0 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
17ee0 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
17ef0 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
17f00 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
17f10 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
17f20 65 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33  e *pBt = sqlite3
17f30 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
17f40 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
17f50 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
17f60 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
17f70 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a  me(pBt) : 0;.}..
17f80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
17f90 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  f database is re
17fa0 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20  ad-only or 0 if 
17fb0 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74  read/write.  Ret
17fc0 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20  urn -1 if.** no 
17fd0 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78  such database ex
17fe0 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
17ff0 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
18000 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
18010 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
18020 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
18030 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
18040 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
18050 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
18060 42 74 20 3f 20 73 71 6c 69 74 65 33 50 61 67 65  Bt ? sqlite3Page
18070 72 49 73 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69  rIsreadonly(sqli
18080 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
18090 74 29 29 20 3a 20 2d 31 3b 0a 7d 0a              t)) : -1;.}.