/ Hex Artifact Content
Login

Artifact 0b321fc873ff2c09b996dea9f74443e4cd9ae28d:


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 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4050: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4060: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4070: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4080: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
4090: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
40a0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
40b0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
40c0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
40d0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
40e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
40f0: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
4100: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
4110: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
4120: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4130: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
4140: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
4150: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4160: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
4170: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
4180: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
4190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
41a0: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
41b0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
41c0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
41d0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
41e0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
41f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4200: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
4210: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4220: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
4230: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
4240: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
4250: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4260: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4270: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
4280: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4290: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
42a0: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
42b0: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
42c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
42d0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
42e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
42f0: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
4300: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
4310: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
4320: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
4330: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
4340: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
4350: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
4360: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
4370: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
4380: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
4390: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
43a0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
43b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
43c0: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
43d0: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
43e0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
43f0: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
4400: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
4410: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
4420: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
4430: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
4440: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
4450: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
4460: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
4470: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
4480: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
4490: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
44a0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
44b0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
44c0: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
44d0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
44e0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
44f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
4500: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
4510: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4520: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4530: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
4540: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
4550: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
4560: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
4570: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
4580: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
4590: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
45a0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
45b0: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
45c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
45d0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
45e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
45f0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
4600: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4610: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4620: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4630: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4640: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4650: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4660: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4670: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4680: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4690: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
46a0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
46b0: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
46c0: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
46d0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
46e0: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
46f0: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
4700: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4710: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4720: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4730: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4740: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4750: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4760: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4770: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4780: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4790: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
47a0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
47b0: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
47c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
47d0: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  End = 0;.    db-
47e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
47f0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
4800: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4810: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4840: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4850: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4860: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4870: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4880: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4890: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
48a0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
48b0: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
48c0: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
48d0: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
48e0: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
48f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
4900: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
4910: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
4920: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
4930: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4940: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4950: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4970: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4980: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4990: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
49a0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
49b0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
49c0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
49d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
49e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
49f0: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
4a00: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
4a10: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4a20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
4a30: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
4a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4a50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4a60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4a70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4a80: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4a90: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4aa0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4ab0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4ac0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4ad0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
4ae0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
4af0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
4b00: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
4b10: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
4b20: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
4b30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
4b40: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
4b50: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
4b60: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
4b70: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
4b80: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
4b90: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
4ba0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4bb0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
4bc0: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
4bd0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
4be0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4bf0: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
4c00: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
4c10: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
4c20: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
4c30: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
4c40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4c50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4c60: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
4c70: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
4c80: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
4c90: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
4ca0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
4cb0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
4cc0: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
4cd0: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
4ce0: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
4cf0: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
4d00: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
4d10: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
4d20: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
4d30: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
4d40: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
4d50: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
4d60: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
4d70: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
4d80: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
4d90: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
4da0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
4db0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
4dc0: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
4dd0: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
4de0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
4df0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
4e00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
4e10: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
4e30: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
4e40: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4e50: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
4e60: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
4e70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
4e80: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
4e90: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
4ea0: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4ec0: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
4ed0: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
4ee0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
4ef0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
4f00: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
4f10: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
4f20: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
4f30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
4f40: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
4f50: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
4f60: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
4f70: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
4f80: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
4f90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4fa0: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
4fb0: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
4fc0: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
4fd0: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
4fe0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ff0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5000: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
5010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5040: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5060: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5070: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
5080: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
5090: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
50a0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
50b0: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
50c0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
50d0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
50e0: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
50f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
5100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5110: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
5120: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
5130: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
5140: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
5150: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
5160: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
5170: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
5180: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
5190: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
51a0: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
51b0: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
51c0: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
51d0: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
51e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
51f0: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
5200: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
5210: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
5220: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
5230: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
5240: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5250: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
5260: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
5270: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
5280: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
5290: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
52a0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
52b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
52c0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
52d0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
52e0: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
52f0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
5300: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
5310: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
5320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
5330: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
5340: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
5350: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
5360: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
5370: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5380: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
5390: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
53a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
53b0: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
53c0: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
53d0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
53e0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
53f0: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
5400: 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndant.** compari
5410: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
5420: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
5430: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
5440: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
5450: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
5460: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
5470: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
5480: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
5490: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
54a0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
54b0: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
54c0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
54d0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
54e0: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
54f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5500: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
5510: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
5520: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
5530: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
5540: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
5550: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
5560: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
5570: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
5580: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
5590: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
55a0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
55b0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
55c0: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
55d0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
55e0: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
55f0: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
5600: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
5610: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
5620: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
5630: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
5640: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
5650: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
5660: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5670: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
5680: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5690: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
56a0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
56b0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
56c0: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
56d0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
56e0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
56f0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
5700: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5710: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5720: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
5730: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5740: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5750: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5760: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5770: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5780: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5790: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
57a0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
57b0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
57c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
57d0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
57e0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
57f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
5800: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
5810: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
5820: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
5830: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5840: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5850: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5860: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5870: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5880: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5890: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
58a0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
58b0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
58c0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
58d0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
58e0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
58f0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
5900: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
5910: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
5920: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
5930: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5940: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5950: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5960: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5970: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5980: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5990: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
59a0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
59b0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
59c0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
59d0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
59e0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
59f0: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
5a00: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
5a10: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
5a20: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
5a30: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5a40: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5a50: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5a60: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5a70: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5a80: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5a90: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5aa0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5ab0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5ac0: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5ad0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
5ae0: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
5af0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
5b00: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
5b10: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
5b20: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
5b30: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
5b40: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
5b50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5b60: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
5b70: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
5b80: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65  ../*.** Disconne
5b90: 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76  ct all sqlite3_v
5ba0: 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74  tab objects that
5bb0: 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62   belong to datab
5bc0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
5bd0: 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61  * db. This is ca
5be0: 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20  lled when db is 
5bf0: 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f  being closed..*/
5c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
5c10: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73  connectAllVtab(s
5c20: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
5c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5c40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
5c50: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
5c60: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
5c70: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5c80: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
5c90: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
5ca0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
5cb0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
5cc0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
5cd0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73  ema ){.      Has
5ce0: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  hElem *p;.      
5cf0: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
5d00: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
5d10: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
5d20: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
5d30: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
5d40: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
5d50: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
5d60: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
5d70: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
5d80: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
5d90: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
5da0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
5db0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
5dc0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
5dd0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
5de0: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
5df0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
5e00: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
5e10: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5e20: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
5e30: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
5e40: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
5e50: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
5e60: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
5e70: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
5e80: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
5e90: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
5ea0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
5eb0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ec0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
5ed0: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
5ee0: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
5ef0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
5f00: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
5f10: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
5f20: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
5f30: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
5f40: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
5f50: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
5f60: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
5f70: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
5f80: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
5f90: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5fb0: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
5fc0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
5fd0: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
5fe0: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
5ff0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6000: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
6010: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
6020: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
6030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6040: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
6050: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6060: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6070: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
6080: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
6090: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
60a0: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
60b0: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
60c0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
60d0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
60e0: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
60f0: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
6100: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
6110: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
6120: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
6130: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
6140: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
6150: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
6160: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
6170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
6180: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
6190: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
61a0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
61b0: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
61c0: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
61d0: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
61e0: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
61f0: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
6200: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
6210: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
6220: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
6230: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
6240: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
6250: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6260: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
6270: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
6280: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
6290: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
62a0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
62b0: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
62c0: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
62d0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
62e0: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
62f0: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
6300: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
6310: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6320: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
6330: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
6340: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
6350: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
6360: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
6370: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6380: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
6390: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
63a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
63b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
63c0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
63d0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
63e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f   connection into
63f0: 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68   a zombie and th
6400: 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a  en close it..  *
6410: 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  /.  db->magic = 
6420: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
6430: 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65  BIE;.  sqlite3Le
6440: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
6450: 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65  Zombie(db);.  re
6460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72  }../*.** Two var
6480: 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70  iations on the p
6490: 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20  ublic interface 
64a0: 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61  for closing a da
64b0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
64c0: 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65  tion. The sqlite
64d0: 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f  3_close() versio
64e0: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
64f0: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61  _BUSY and.** lea
6500: 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ves the connecti
6510: 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65  on option if the
6520: 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a  re are unfinaliz
6530: 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ed prepared.** s
6540: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
6550: 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f  inished sqlite3_
6560: 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71  backups.  The sq
6570: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
6580: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63  .** version forc
6590: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  es the connectio
65a0: 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f  n to become a zo
65b0: 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61 72  mbie if there ar
65c0: 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65  e.** unclosed re
65d0: 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72  sources, and arr
65e0: 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f  anges for deallo
65f0: 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  cation when the 
6600: 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20  last.** prepare 
6610: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c  statement or sql
6620: 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73  ite3_backup clos
6630: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
6640: 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33  e3_close(sqlite3
6650: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
6660: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29  lite3Close(db,0)
6670: 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ; }.int sqlite3_
6680: 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33  close_v2(sqlite3
6690: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
66a0: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29  lite3Close(db,1)
66b0: 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ; }.../*.** Clos
66c0: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  e the mutex on d
66d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
66e0: 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72  on db..**.** Fur
66f0: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74  thermore, if dat
6700: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6710: 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20   db is a zombie 
6720: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68  (meaning that th
6730: 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ere.** has been 
6740: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
6750: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
6760: 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ) or sqlite3_clo
6770: 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a  se_v2(db)) and.*
6780: 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  * every sqlite3_
6790: 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65  stmt has now bee
67a0: 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
67b0: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61  every sqlite3_ba
67c0: 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69  ckup has.** fini
67d0: 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20  shed, then free 
67e0: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  all resources..*
67f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65  /.void sqlite3Le
6800: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
6810: 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a  Zombie(sqlite3 *
6820: 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  db){.  HashElem 
6830: 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *i;             
6840: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
6850: 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f  able iterator */
6860: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
6870: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
6880: 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33  standing sqlite3
6890: 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33  _stmt or sqlite3
68a0: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a  _backup objects.
68b0: 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63    ** or if the c
68c0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f  onnection has no
68d0: 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65  t yet been close
68e0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d by sqlite3_clo
68f0: 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68  se_v2(),.  ** th
6900: 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68  en just leave th
6910: 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75  e mutex and retu
6920: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  rn..  */.  if( d
6930: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
6940: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c  _MAGIC_ZOMBIE ||
6950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
6960: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
6970: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6980: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
6990: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
69a0: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
69b0: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
69c0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
69d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
69e0: 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64   has.  ** closed
69f0: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d   all sqlite3_stm
6a00: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61  t and sqlite3_ba
6a10: 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64  ckup objects and
6a20: 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70   has been.  ** p
6a30: 61 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f  ased to sqlite3_
6a40: 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74  close (meaning t
6a50: 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62  hat it is a zomb
6a60: 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  ie).  Therefore,
6a70: 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61  .  ** go ahead a
6a80: 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  nd free all reso
6a90: 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  urces..  */..  /
6aa0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
6ab0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
6ac0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
6ad0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
6ae0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
6af0: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
6b00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
6b10: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
6b20: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
6b30: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
6b40: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
6b50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
6b60: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
6b70: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
6b80: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
6b90: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
6ba0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
6bb0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
6bc0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
6bd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
6be0: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
6bf0: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
6c00: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
6c10: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
6c20: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
6c30: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
6c40: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
6c50: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
6c60: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
6c70: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
6c80: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
6c90: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
6ca0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
6cb0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
6cc0: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
6cd0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
6ce0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
6cf0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
6d00: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
6d10: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
6d20: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
6d30: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
6d40: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
6d50: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
6d60: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
6d70: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
6d80: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
6d90: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
6da0: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
6db0: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
6dc0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
6dd0: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
6de0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
6df0: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
6e00: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
6e10: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
6e20: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
6e30: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
6e40: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
6e50: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
6e60: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
6e70: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
6e80: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
6e90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6ea0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
6eb0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
6ec0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
6ed0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
6ee0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
6ef0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
6f00: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
6f10: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
6f20: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
6f30: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
6f40: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
6f50: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
6f60: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
6f70: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
6f80: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
6f90: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
6fa0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
6fb0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
6fc0: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
6fd0: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
6fe0: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
6ff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7000: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7010: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
7020: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
7030: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
7040: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
7050: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7060: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
7070: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7080: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
7090: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
70a0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
70b0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
70c0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
70d0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
70e0: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
70f0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
7100: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
7110: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
7130: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
7140: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7150: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
7160: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
7170: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
7180: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
7190: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
71a0: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
71b0: 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29    if( db->pErr )
71c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
71d0: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
71e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
71f0: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
7200: 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  b);..  db->magic
7210: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
7220: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
7230: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
7240: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
7250: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
7260: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
7270: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
7280: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
7290: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
72a0: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
72b0: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
72c0: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
72d0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
72e0: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
72f0: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
7300: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
7310: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
7320: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
7330: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
7340: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
7350: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
7360: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
7370: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
7380: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
7390: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
73a0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
73b0: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
73c0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
73d0: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
73e0: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
73f0: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
7400: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
7410: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
7420: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
7430: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
7440: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
7450: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
7460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7470: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
7480: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
7490: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
74a0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  b);.}../*.** Rol
74b0: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
74c0: 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72  se files.  If tr
74d0: 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
74e0: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a  LITE_OK, then.**
74f0: 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
7500: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7510: 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61  d ("tripped" - a
7520: 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61  s in "tripping a
7530: 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61   circuit.** brea
7540: 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74  ker") and made t
7550: 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64  o return tripCod
7560: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
7570: 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74  ny further.** at
7580: 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68  tempts to use th
7590: 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f  at cursor..*/.vo
75a0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
75b0: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
75c0: 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  b, int tripCode)
75d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
75e0: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
75f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7600: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
7610: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
7620: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
7630: 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30  loc();.  for(i=0
7640: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
7650: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
7660: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
7670: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
7680: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7690: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
76a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54  ) ){.        inT
76b0: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  rans = 1;.      
76c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
76d0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
76e0: 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 20  tripCode);.     
76f0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72   db->aDb[i].inTr
7700: 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ans = 0;.    }. 
7710: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
7720: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
7730: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
7740: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
7750: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
7760: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
7770: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
7780: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
7790: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
77a0: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
77b0: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
77c0: 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f  on(db);.  }..  /
77d0: 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63  * Any deferred c
77e0: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
77f0: 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65  ions have now be
7800: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
7810: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
7820: 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ons = 0;..  /* I
7830: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
7840: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
7850: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
7860: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
7870: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
7880: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
7890: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
78a0: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
78b0: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
78c0: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
78d0: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
78e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
78f0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
7900: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
7910: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
7920: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
7930: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
7940: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
7950: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
7960: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
7970: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
7980: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
7990: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
79a0: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
79b0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
79c0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
79d0: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
79e0: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
79f0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
7a00: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
7a10: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
7a20: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
7a30: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
7a40: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
7a50: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7a60: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
7a70: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
7a80: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
7a90: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
7aa0: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
7ab0: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
7ac0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
7ad0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
7ae0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
7af0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
7b00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
7b10: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
7b20: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
7b30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
7b40: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
7b50: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
7b60: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
7b70: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7b80: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
7b90: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
7ba0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
7bb0: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
7bc0: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
7bd0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
7be0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
7bf0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
7c00: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
7c10: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
7c20: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
7c30: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
7c40: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
7c50: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
7c60: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
7c70: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
7c80: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
7c90: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
7ca0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
7cb0: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
7cc0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
7cd0: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
7ce0: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
7cf0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
7d00: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
7d10: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
7d20: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
7d30: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
7d40: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
7d50: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
7d60: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
7d70: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
7d80: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
7d90: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7da0: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
7db0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7dc0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
7dd0: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
7de0: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
7df0: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
7e00: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
7e10: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
7e20: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
7e30: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
7e40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
7e50: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
7e60: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
7e70: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
7e80: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
7e90: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
7ea0: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
7eb0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
7ec0: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
7ed0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
7ee0: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
7ef0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
7f00: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
7f10: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
7f20: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
7f30: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7f40: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
7f50: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
7f60: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
7f70: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
7f80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
7f90: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
7fa0: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
7fb0: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
7fc0: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
7fd0: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
7fe0: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
7ff0: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
8000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8010: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
8020: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
8030: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
8040: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
8050: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
8060: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
8070: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
8080: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
8090: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
80a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
80b0: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
80c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
80d0: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
80e0: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
80f0: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
8100: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
8110: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
8120: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
8130: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
8140: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
8150: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
8160: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
8170: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
8180: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
8190: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
81a0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
81b0: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
81d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
81e0: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
8210: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
8220: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
8230: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
8240: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
8250: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
8260: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
8270: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
8280: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
8290: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
82a0: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
82b0: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
82c0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
82d0: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
82e0: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
82f0: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
8300: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
8310: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
8320: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
8330: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
8340: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
8350: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
8360: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
8370: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
8380: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
8390: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
83a0: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
83b0: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
83c0: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
83d0: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
83e0: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
83f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
8400: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
8410: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
8420: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
8430: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
8440: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
8450: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
8460: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
8470: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
8480: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
8490: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
84a0: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
84b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
84c0: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
84d0: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
84e0: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
84f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
8500: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
8510: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
8520: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
8530: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
8540: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
8550: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
8560: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8570: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
8580: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
8590: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
85a0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
85b0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
85c0: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
85d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
85e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
85f0: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
8600: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
8610: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
8620: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
8630: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
8640: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
8650: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
8660: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
8670: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
8680: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
8690: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
86a0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
86b0: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
86c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
86d0: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
86e0: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
86f0: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
8700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
8710: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
8720: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
8730: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
8740: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
8750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
8760: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
8770: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
8780: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8790: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
87a0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
87b0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
87c0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
87d0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
87e0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
87f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
8800: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
8810: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
8820: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
8830: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
8840: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
8850: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8860: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8870: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
8880: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
8890: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
88a0: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
88b0: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
88c0: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
88d0: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
88e0: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
88f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8900: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
8910: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8930: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
8940: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
8950: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
8960: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
8970: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
8980: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
8990: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
89a0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
89b0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
89c0: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
89d0: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
89e0: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
89f0: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
8a00: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
8a10: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
8a20: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
8a30: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
8a40: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
8a50: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
8a60: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
8a70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8a80: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8a90: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
8aa0: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
8ab0: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
8ac0: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
8ad0: 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64  ps = nOps;.    d
8ae0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
8af0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
8b00: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
8b10: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
8b20: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
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 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
8b50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8b60: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8b70: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
8b80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8b90: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
8ba0: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
8bb0: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
8bc0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
8bd0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
8be0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
8bf0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
8c00: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
8c10: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
8c20: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69  db, int ms){.  i
8c30: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73  f( ms>0 ){.    s
8c40: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
8c50: 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65  ler(db, sqliteDe
8c60: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
8c70: 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20  k, (void*)db);. 
8c80: 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f     db->busyTimeo
8c90: 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65  ut = ms;.  }else
8ca0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
8cb0: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
8cc0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
8cd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8ce0: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
8cf0: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
8d00: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
8d10: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
8d20: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
8d30: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
8d40: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
8d50: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
8d60: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
8d70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
8d80: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
8d90: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
8da0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8db0: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
8dc0: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
8dd0: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
8de0: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
8df0: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
8e00: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
8e10: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
8e20: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
8e30: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
8e40: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
8e50: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
8e60: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
8e70: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
8e80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
8e90: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
8ea0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
8eb0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
8ec0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
8ed0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
8ee0: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
8ef0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
8f00: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
8f10: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
8f20: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
8f30: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
8f40: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
8f50: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
8f60: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
8f70: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8f80: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
8f90: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
8fa0: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
8fb0: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
8fc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8fd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
8fe0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8ff0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
9000: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
9010: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
9020: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
9030: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
9040: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
9050: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
9060: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
9070: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
9080: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
9090: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
90a0: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
90b0: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
90c0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
90d0: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
90e0: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
90f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
9100: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23  E_BKPT;.  }.  .#
9110: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9120: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
9130: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
9140: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
9150: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
9160: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
9170: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
9180: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
9190: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
91a0: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
91b0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
91c0: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
91d0: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
91e0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
91f0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
9200: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
9210: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
9220: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
9230: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
9240: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
9250: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
9260: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
9270: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
9280: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
9290: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
92a0: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
92b0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
92c0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
92d0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
92e0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
92f0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
9300: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
9310: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
9320: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
9330: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9340: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9350: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
9360: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
9370: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
9380: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a  SQLITE_UTF16LE,.
9390: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
93a0: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
93b0: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
93c0: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
93d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
93e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
93f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9400: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
9410: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
9420: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
9430: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
9440: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
9450: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
9460: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
9470: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
9480: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
9490: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
94a0: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
94b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
94c0: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
94d0: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
94e0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
94f0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
9500: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
9510: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
9520: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
9530: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
9540: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
9550: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
9560: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
9570: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
9580: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
9590: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
95a0: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
95b0: 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45  ( p && p->iPrefE
95c0: 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  nc==enc && p->nA
95d0: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
95e0: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
95f0: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
9600: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
9610: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
9620: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
9630: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
9640: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
9650: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
9660: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
9670: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
9680: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
9690: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
96a0: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
96b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
96c0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
96d0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
96e0: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
96f0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
9700: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
9710: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
9720: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
9730: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
9740: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
9750: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
9760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9770: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
9780: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
9790: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
97a0: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
97b0: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
97c0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
97d0: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
97e0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
97f0: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
9800: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
9810: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
9820: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
9830: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
9840: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
9850: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
9860: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
9870: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e  flags = 0;.  p->
9880: 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20  xFunc = xFunc;. 
9890: 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65   p->xStep = xSte
98a0: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
98b0: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
98c0: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
98d0: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
98e0: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
98f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9900: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
9910: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
9920: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
9930: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
9940: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
9950: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
9960: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
9970: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
9980: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
9990: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
99a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
99b0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
99c0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
99d0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
99e0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
99f0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
9a00: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
9a10: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
9a20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
9a30: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
9a40: 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63  ion_v2(db, zFunc
9a50: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
9a60: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  xFunc, xStep,.  
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a    xFinal, 0);.}.
9aa0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
9ab0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
9ac0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
9ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
9ae0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
9af0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
9b00: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
9b10: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
9b20: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
9b30: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
9b40: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
9b50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
9b60: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
9b70: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
9b80: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
9b90: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
9ba0: 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f  d (*xDestroy)(vo
9bb0: 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  id *).){.  int r
9bc0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
9bd0: 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ;.  FuncDestruct
9be0: 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20  or *pArg = 0;.  
9bf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9c00: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9c10: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
9c20: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
9c30: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
9c40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9c50: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
9c60: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
9c70: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
9c80: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
9c90: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
9ca0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
9cb0: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
9cc0: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
9cd0: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
9ce0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
9cf0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
9d00: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
9d10: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
9d20: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41  Step, xFinal, pA
9d30: 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20  rg);.  if( pArg 
9d40: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
9d50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9d60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
9d70: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
9d80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
9d90: 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ree(db, pArg);. 
9da0: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
9db0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
9dc0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
9dd0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9de0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
9df0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
9e00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
9e10: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
9e20: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
9e30: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
9e40: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
9e50: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
9e60: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
9e70: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
9e80: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
9e90: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
9ea0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
9eb0: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
9ec0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
9ed0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
9ee0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
9ef0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
9f00: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
9f10: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
9f20: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
9f30: 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  nc8;.  sqlite3_m
9f40: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9f50: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
9f60: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
9f70: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
9f80: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
9f90: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
9fa0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
9fb0: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
9fc0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
9fd0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
9fe0: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
9ff0: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
a000: 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20  p, xFinal,0);.  
a010: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a020: 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
a030: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
a040: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
a050: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a060: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
a070: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
a080: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  f.../*.** Declar
a090: 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f  e that a functio
a0a0: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c  n has been overl
a0b0: 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75  oaded by a virtu
a0c0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
a0d0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
a0e0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
a0f0: 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62  s a regular glob
a100: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  al function, the
a110: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
a120: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
a130: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
a140: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
a150: 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20  hen create.** a 
a160: 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77  new one that alw
a170: 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e  ays throws a run
a180: 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a  -time error.  .*
a190: 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61  *.** When virtua
a1a0: 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20  l tables intend 
a1b0: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76  to provide an ov
a1c0: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
a1d0: 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  n, they.** shoul
a1e0: 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  d call this rout
a1f0: 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ine to make sure
a200: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
a210: 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20  tion exists..** 
a220: 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  A global functio
a230: 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20  n must exist in 
a240: 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72  order for name r
a250: 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72  esolution to wor
a260: 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  k.** properly..*
a270: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76  /.int sqlite3_ov
a280: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
a290: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
a2a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
a2b0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a  ame,.  int nArg.
a2c0: 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  ){.  int nName =
a2d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a2e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72  (zName);.  int r
a2f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a300: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a310: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
a320: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
a330: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
a340: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
a350: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
a360: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  0)==0 ){.    rc 
a370: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
a380: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
a390: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
a3a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
a3c0: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
a3d0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  nction, 0, 0, 0)
a3e0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
a3f0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
a400: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
a410: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
a420: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
a430: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
a440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
a450: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
a460: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
a470: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
a480: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
a490: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
a4a0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
a4b0: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
a4c0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
a4d0: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
a4e0: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
a4f0: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
a500: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
a510: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
a520: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
a530: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
a540: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
a550: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
a560: 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28   *sqlite3_trace(
a570: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
a580: 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64  d (*xTrace)(void
a590: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20  *,const char*), 
a5a0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76  void *pArg){.  v
a5b0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
a5c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a5d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
a5e0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65  Old = db->pTrace
a5f0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  Arg;.  db->xTrac
a600: 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62  e = xTrace;.  db
a610: 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
a620: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
a630: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
a640: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
a650: 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67  Old;.}./*.** Reg
a660: 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
a670: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
a680: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
a690: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
a6a0: 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
a6b0: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
a6c0: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
a6d0: 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
a6e0: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
a6f0: 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
a700: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
a710: 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
a720: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
a730: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
a740: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
a750: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
a760: 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
a770: 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
a780: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
a790: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
a7a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
a7b0: 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
a7c0: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
a7d0: 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
a7e0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
a7f0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
a800: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a810: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
a820: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
a830: 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62  ProfileArg;.  db
a840: 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72  ->xProfile = xPr
a850: 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72  ofile;.  db->pPr
a860: 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b  ofileArg = pArg;
a870: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a880: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a890: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
a8a0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
a8b0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
a8c0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
a8d0: 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f  er a function to
a8e0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e   be invoked when
a8f0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
a900: 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68  ommits..** If th
a910: 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69  e invoked functi
a920: 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
a930: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ero, then the co
a940: 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a  mmit becomes a.*
a950: 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76  * rollback..*/.v
a960: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d  oid *sqlite3_com
a970: 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  mit_hook(.  sqli
a980: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
a990: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
a9a0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
a9b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
a9c0: 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  nt (*xCallback)(
a9d0: 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63  void*),  /* Func
a9e0: 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f  tion to invoke o
a9f0: 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f  n each commit */
aa00: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aa20: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
aa30: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
aa40: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
aa50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
aa60: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
aa70: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
aa80: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
aa90: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
aaa0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
aab0: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
aac0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
aad0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
aae0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
aaf0: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
ab00: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
ab10: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
ab20: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
ab30: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
ab40: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
ab50: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
ab60: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ab70: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
ab80: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
ab90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
abb0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
abc0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
abd0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
abe0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
abf0: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
ac00: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
ac10: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
ac20: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
ac30: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
ac40: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
ac50: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
ac60: 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
ac70: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ac80: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
ac90: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
aca0: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
acb0: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
acc0: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
acd0: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
ace0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
acf0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
ad00: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
ad10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
ad20: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
ad30: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
ad40: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
ad50: 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
ad60: 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
ad70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
ad80: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
ad90: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
ada0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
adc0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
add0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
ade0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
adf0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
ae00: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
ae10: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
ae20: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
ae30: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
ae40: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
ae50: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
ae60: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
ae70: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ae80: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
ae90: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b  b->pRollbackArg;
aea0: 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  .  db->xRollback
aeb0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
aec0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c  back;.  db->pRol
aed0: 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b  lbackArg = pArg;
aee0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
aef0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
af00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
af10: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
af20: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
af30: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  ** The sqlite3_w
af40: 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
af50: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
af60: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
af70: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a  ocheckpoint()..*
af80: 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
af90: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
afa0: 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
afb0: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
afc0: 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  og file.** is gr
afd0: 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74  eater than sqlit
afe0: 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20  e3.pWalArg cast 
aff0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74  to an integer (t
b000: 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
b010: 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75  red by.** wal_au
b020: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e  tocheckpoint()).
b030: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
b040: 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a  WalDefaultHook(.
b050: 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44    void *pClientD
b060: 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75  ata,     /* Argu
b070: 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
b080: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
b090: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a   /* Connection *
b0a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
b0b0: 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  zDb,       /* Da
b0c0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
b0d0: 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20  nFrame          
b0e0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41     /* Size of WA
b0f0: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46  L */.){.  if( nF
b100: 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52  rame>=SQLITE_PTR
b110: 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44  _TO_INT(pClientD
b120: 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ata) ){.    sqli
b130: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
b140: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
b150: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
b160: 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  nt(db, zDb);.   
b170: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
b180: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
b190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b1a0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
b1b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
b1c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  /../*.** Configu
b1d0: 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61  re an sqlite3_wa
b1e0: 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
b1f0: 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  k to automatical
b200: 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a  ly checkpoint.**
b210: 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65   a database afte
b220: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
b230: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
b240: 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f  ere are nFrame o
b250: 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73  r.** more frames
b260: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
b270: 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f  . Passing zero o
b280: 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  r a negative val
b290: 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72  ue as the.** nFr
b2a0: 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69  ame parameter di
b2b0: 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63  sables automatic
b2c0: 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74   checkpoints ent
b2d0: 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  irely..**.** The
b2e0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
b2f0: 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
b300: 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61  ction replaces a
b310: 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c  ny existing call
b320: 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72  back.** register
b330: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
b340: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b  _wal_hook(). Lik
b350: 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69  ewise, registeri
b360: 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ng a callback.**
b370: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
b380: 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c  al_hook() disabl
b390: 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  es the automatic
b3a0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68   checkpoint mech
b3b0: 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75  anism.** configu
b3c0: 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
b3d0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
b3e0: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
b3f0: 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
b400: 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29  *db, int nFrame)
b410: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
b420: 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45  OMIT_WAL.  UNUSE
b430: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
b440: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
b450: 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c  TER(nFrame);.#el
b460: 73 65 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  se.  if( nFrame>
b470: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b480: 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71  _wal_hook(db, sq
b490: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
b4a0: 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ook, SQLITE_INT_
b4b0: 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b  TO_PTR(nFrame));
b4c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b4d0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
b4e0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  b, 0, 0);.  }.#e
b4f0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
b500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b510: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
b520: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
b530: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
b540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77  transaction is w
b550: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74  ritten.** into t
b560: 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c  he write-ahead-l
b570: 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62  og by this datab
b580: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
b590: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
b5a0: 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  _wal_hook(.  sql
b5b0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b5d0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
b5e0: 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c  to this db handl
b5f0: 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c  e */.  int(*xCal
b600: 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73  lback)(void *, s
b610: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
b620: 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f  har*, int),.  vo
b630: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b650: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
b660: 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62  passed to xCallb
b670: 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ack() */.){.#ifn
b680: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b690: 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  WAL.  void *pRet
b6a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
b6b0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
b6c0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
b6d0: 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e  >pWalArg;.  db->
b6e0: 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78  xWalCallback = x
b6f0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
b700: 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a  pWalArg = pArg;.
b710: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b720: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
b730: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
b740: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
b750: 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
b760: 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
b770: 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69  tabase zDb..*/.i
b780: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
b790: 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20  heckpoint_v2(.  
b7a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
b7d0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
b7e0: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
b7f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
b800: 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
b810: 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  base (or NULL) *
b820: 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20  /.  int eMode,  
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48      /* SQLITE_CH
b850: 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65  ECKPOINT_* value
b860: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67   */.  int *pnLog
b870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b880: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
b890: 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e  ze of WAL log in
b8a0: 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74   frames */.  int
b8b0: 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20   *pnCkpt        
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8d0: 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65  OUT: Total numbe
b8e0: 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63  r of frames chec
b8f0: 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23  kpointed */.){.#
b900: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
b910: 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53  T_WAL.  return S
b920: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
b930: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
b960: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
b970: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
b980: 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  HED;  /* sqlite3
b990: 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20  .aDb[] index of 
b9a0: 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  db to checkpoint
b9b0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   */..  /* Initia
b9c0: 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
b9d0: 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20  variables to -1 
b9e0: 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
b9f0: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66   occurs. */.  if
ba00: 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67  ( pnLog ) *pnLog
ba10: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43   = -1;.  if( pnC
ba20: 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20  kpt ) *pnCkpt = 
ba30: 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53  -1;..  assert( S
ba40: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ba50: 5f 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45  _FULL>SQLITE_CHE
ba60: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20  CKPOINT_PASSIVE 
ba70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
ba80: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
ba90: 55 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL<SQLITE_CHECK
baa0: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b  POINT_RESTART );
bab0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
bac0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
bad0: 53 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43  SIVE+2==SQLITE_C
bae0: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
baf0: 54 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  T );.  if( eMode
bb00: 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
bb10: 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d  NT_PASSIVE || eM
bb20: 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode>SQLITE_CHECK
bb30: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b  POINT_RESTART ){
bb40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bb50: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a  TE_MISUSE;.  }..
bb60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bb70: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
bb80: 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a  ;.  if( zDb && z
bb90: 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62  Db[0] ){.    iDb
bba0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
bbb0: 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
bbc0: 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29   }.  if( iDb<0 )
bbd0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
bbe0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
bbf0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
bc00: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
bc10: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
bc20: 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
bc30: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
bc40: 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
bc50: 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e  , iDb, eMode, pn
bc60: 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
bc70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
bc80: 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20  b, rc, 0);.  }. 
bc90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
bca0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
bcb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
bcc0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
bcd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
bce0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
bcf0: 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
bd00: 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73  e zDb. If zDb is
bd10: 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65   NULL, or if the
bd20: 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e   buffer zDb poin
bd30: 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e  ts.** to contain
bd40: 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  s a zero-length 
bd50: 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61  string, all atta
bd60: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
bd70: 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  re .** checkpoin
bd80: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
bd90: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
bda0: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
bdb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
bdc0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
bdd0: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
bde0: 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51  t_v2(db, zDb, SQ
bdf0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
be00: 50 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a  PASSIVE, 0, 0);.
be10: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
be20: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
be30: 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   Run a checkpoin
be40: 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44  t on database iD
be50: 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  b. This is a no-
be60: 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69  op if database i
be70: 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72  Db is.** not cur
be80: 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57  rently open in W
be90: 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  AL mode..**.** I
bea0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
beb0: 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
bec0: 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68  atabase being ch
bed0: 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73  eckpointed, this
bee0: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
bef0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
bf00: 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70  KED and a checkp
bf10: 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65  oint is not atte
bf20: 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e  mpted. If .** an
bf30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
bf40: 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
bf50: 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53  checkpoint, an S
bf60: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
bf70: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
bf80: 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f   (i.e. SQLITE_IO
bf90: 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERR). Otherwise,
bfa0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
bfb0: 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  * The mutex on d
bfc0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
bfd0: 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  b should be held
bfe0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
bff0: 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73  The mutex.** ass
c000: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
c010: 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65   specific b-tree
c020: 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
c030: 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a  ted is taken by.
c040: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
c050: 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b   while the check
c060: 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67  point is running
c070: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69  ..**.** If iDb i
c080: 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f  s passed SQLITE_
c090: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68  MAX_ATTACHED, th
c0a0: 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  en all attached 
c0b0: 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a  databases are.**
c0c0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49   checkpointed. I
c0d0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
c0e0: 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
c0f0: 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
c100: 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74  tely -.** no att
c110: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
c120: 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72  checkpoint any r
c130: 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73  emaining databas
c140: 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  es..**.** Parame
c150: 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65  ter eMode is one
c160: 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   of SQLITE_CHECK
c170: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46  POINT_PASSIVE, F
c180: 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a  ULL or RESTART..
c190: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
c1a0: 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
c1b0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
c1c0: 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70  nt eMode, int *p
c1d0: 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70  nLog, int *pnCkp
c1e0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
c1f0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
c200: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
c210: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
c240: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
c250: 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62  ough attached db
c260: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79  s */.  int bBusy
c270: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c280: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
c290: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61  f SQLITE_BUSY ha
c2a0: 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  s been encounter
c2b0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
c2c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c2d0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
c2e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c  ;.  assert( !pnL
c2f0: 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31  og || *pnLog==-1
c300: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
c310: 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74  nCkpt || *pnCkpt
c320: 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69  ==-1 );..  for(i
c330: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26  =0; i<db->nDb &&
c340: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
c350: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
c360: 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c  =iDb || iDb==SQL
c370: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
c380: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
c390: 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b  qlite3BtreeCheck
c3a0: 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d  point(db->aDb[i]
c3b0: 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c  .pBt, eMode, pnL
c3c0: 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
c3d0: 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20     pnLog = 0;.  
c3e0: 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a      pnCkpt = 0;.
c3f0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
c400: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
c410: 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a       bBusy = 1;.
c420: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c430: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
c440: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
c450: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
c460: 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53  OK && bBusy) ? S
c470: 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b  QLITE_BUSY : rc;
c480: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c490: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
c4a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c4b0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
c4c0: 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79  e if main-memory
c4d0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
c4e0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20  instead of.** a 
c4f0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66  temporary file f
c500: 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67  or transient pag
c510: 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61  er files and sta
c520: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
c530: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
c540: 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f  turned depends o
c550: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64  n the value of d
c560: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72  b->temp_store (r
c570: 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65  untime.** parame
c580: 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d  ter) and the com
c590: 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
c5a0: 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  of SQLITE_TEMP_S
c5b0: 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c  TORE. The.** fol
c5c0: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
c5d0: 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74  cribes the relat
c5e0: 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
c5f0: 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73  these two values
c600: 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e  .** and this fun
c610: 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61  ctions return va
c620: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  lue..**.**   SQL
c630: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20  ITE_TEMP_STORE  
c640: 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72     db->temp_stor
c650: 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f  e     Location o
c660: 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  f temporary data
c670: 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  base.**   ------
c680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
c6a0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
c700: 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
c730: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
c740: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
c770: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
c780: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
c790: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
c7a0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
c7b0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
c7c0: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
c7d0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
c7e0: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
c800: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
c810: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
c820: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
c840: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
c850: 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   1).**   2      
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
c890: 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20  urn 1).**   3   
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
c8c0: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
c8d0: 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74  return 1).*/.int
c8e0: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
c8f0: 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74  mory(const sqlit
c900: 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c  e3 *db){.#if SQL
c910: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
c920: 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  1.  return ( db-
c930: 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29  >temp_store==2 )
c940: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
c950: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
c960: 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  2.  return ( db-
c970: 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29  >temp_store!=1 )
c980: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
c990: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
c9a0: 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  3.  return 1;.#e
c9b0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
c9c0: 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20  TEMP_STORE<1 || 
c9d0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
c9e0: 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  E>3.  return 0;.
c9f0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
ca00: 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
ca10: 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
ca20: 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
ca30: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
ca40: 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
ca50: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
ca60: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
ca70: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
ca80: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
ca90: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
caa0: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
cab0: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
cac0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
cad0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
cae0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
caf0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
cb00: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49  ErrStr(SQLITE_MI
cb10: 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a  SUSE_BKPT);.  }.
cb20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cb30: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cb40: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
cb50: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
cb60: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
cb70: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
cb80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
cb90: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
cba0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e  _value_text(db->
cbb0: 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72  pErr);.    asser
cbc0: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
cbd0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
cbe0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z==0 ){.      z 
cbf0: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
cc00: 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20  db->errCode);.  
cc10: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
cc20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
cc30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
cc40: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
cc50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
cc60: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  16./*.** Return 
cc70: 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45  UTF-16 encoded E
cc80: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
cc90: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
cca0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
ccb0: 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
ccc0: 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  t void *sqlite3_
ccd0: 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33  errmsg16(sqlite3
cce0: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
ccf0: 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d  const u16 outOfM
cd00: 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27  em[] = {.    'o'
cd10: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
cd20: 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
cd30: 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27  'm', 'e', 'm', '
cd40: 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a  o', 'r', 'y', 0.
cd50: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
cd60: 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d  nst u16 misuse[]
cd70: 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69   = {.    'l', 'i
cd80: 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27  ', 'b', 'r', 'a'
cd90: 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c  , 'r', 'y', ' ',
cda0: 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20   .    'r', 'o', 
cdb0: 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27  'u', 't', 'i', '
cdc0: 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20  n', 'e', ' ', . 
cdd0: 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27     'c', 'a', 'l'
cde0: 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c  , 'l', 'e', 'd',
cdf0: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
ce00: 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a  'u', 't', ' ', .
ce10: 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20      'o', 'f', ' 
ce20: 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27  ', .    's', 'e'
ce30: 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c  , 'q', 'u', 'e',
ce40: 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20   'n', 'c', 'e', 
ce50: 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
ce60: 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
ce70: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
ce80: 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
ce90: 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  m;.  }.  if( !sq
cea0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
ceb0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
cec0: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
ced0: 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20   *)misuse;.  }. 
cee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
cef0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
cf00: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
cf10: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
cf20: 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66   = (void *)outOf
cf30: 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Mem;.  }else{.  
cf40: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
cf50: 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
cf60: 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  Err);.    if( z=
cf70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
cf80: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
cf90: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c  b->pErr, -1, sql
cfa0: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
cfb0: 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20  rrCode),.       
cfc0: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
cfd0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
cfe0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
cff0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
d000: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d  db->pErr);.    }
d010: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  .    /* A malloc
d020: 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
d030: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
d040: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
d050: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20  lue_text16().   
d060: 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68   ** above. If th
d070: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
d080: 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c  then the db->mal
d090: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e  locFailed flag n
d0a0: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
d0b0: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
d0c0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
d0d0: 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
d0e0: 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20  stead of via.   
d0f0: 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78   ** sqlite3ApiEx
d100: 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73  it(), to avoid s
d110: 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  etting the datab
d120: 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  ase handle error
d130: 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f   message..    */
d140: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
d150: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  ailed = 0;.  }. 
d160: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d170: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d180: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
d190: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d1a0: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
d1b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d1c0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
d1d0: 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  r code generated
d1e0: 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f   by an SQLite ro
d1f0: 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69  utine. If NULL i
d200: 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74  s.** passed to t
d210: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65  his function, we
d220: 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63   assume a malloc
d230: 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67  () failed during
d240: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
d250: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d260: 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
d270: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
d280: 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
d290: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
d2a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d2b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d2c0: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
d2d0: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
d2e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
d2f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d300: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
d310: 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
d320: 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
d330: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
d340: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
d350: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
d360: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
d370: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
d380: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
d390: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
d3a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
d3b0: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
d3c0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
d3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d3e0: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
d3f0: 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a  db->errCode;.}..
d400: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
d410: 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ew collating fun
d420: 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61  ction for databa
d430: 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61  se "db".  The na
d440: 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61  me is zName.** a
d450: 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  nd the encoding 
d460: 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69  is enc..*/.stati
d470: 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c  c int createColl
d480: 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
d490: 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  * db,.  const ch
d4a0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38  ar *zName, .  u8
d4b0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43   enc,.  void* pC
d4c0: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
d4d0: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
d4e0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
d4f0: 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
d500: 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
d510: 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
d520: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
d530: 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  2;.  int nName =
d540: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
d550: 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73  (zName);.  .  as
d560: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d570: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
d580: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
d590: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
d5a0: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
d5b0: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
d5c0: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
d5d0: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
d5e0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
d5f0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
d600: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
d610: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
d620: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
d630: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
d640: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
d650: 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
d660: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
d670: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
d680: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
d690: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
d6a0: 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
d6b0: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
d6c0: 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
d6d0: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
d6e0: 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
d6f0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
d700: 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
d710: 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
d720: 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
d730: 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
d740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
d750: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
d760: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
d770: 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
d780: 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
d790: 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
d7a0: 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
d7b0: 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
d7c0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
d7d0: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
d7e0: 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
d7f0: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
d800: 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
d810: 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
d820: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
d830: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
d840: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
d850: 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
d860: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
d870: 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
d880: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
d890: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
d8a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d8b0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
d8c0: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
d8d0: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
d8e0: 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
d8f0: 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
d900: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
d910: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
d920: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
d930: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d940: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
d950: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
d960: 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
d970: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
d980: 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
d990: 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
d9a0: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
d9b0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
d9c0: 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
d9d0: 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
d9e0: 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
d9f0: 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
da00: 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
da10: 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
da20: 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
da30: 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
da40: 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
da50: 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
da60: 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
da70: 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
da80: 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
da90: 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
daa0: 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
dab0: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
dac0: 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
dad0: 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
dae0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
daf0: 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
db00: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
db10: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
db20: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
db30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
db40: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
db50: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
db60: 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
db70: 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
db80: 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
db90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
dba0: 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
dbb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dbc0: 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
dbd0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
dbe0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
dbf0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
dc00: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
dc10: 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
dc20: 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
dc30: 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
dc40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
dc50: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
dc60: 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d  ompare;.  pColl-
dc70: 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20  >pUser = pCtx;. 
dc80: 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78   pColl->xDel = x
dc90: 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e  Del;.  pColl->en
dca0: 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20  c = (u8)(enc2 | 
dcb0: 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54  (enc & SQLITE_UT
dcc0: 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20  F16_ALIGNED));. 
dcd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
dce0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
dcf0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dd00: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
dd10: 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
dd20: 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
dd30: 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
dd40: 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
dd50: 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
dd60: 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
dd70: 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
dd80: 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
dd90: 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
dda0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
ddb0: 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
ddc0: 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
ddd0: 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
dde0: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
ddf0: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
de00: 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
de10: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
de20: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
de30: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
de40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
de50: 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
de60: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
de70: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
de80: 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
de90: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
dea0: 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
deb0: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
dec0: 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f  UMBER,.  SQLITE_
ded0: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
dee0: 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  H,.};../*.** Mak
def0: 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20  e sure the hard 
df00: 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74  limits are set t
df10: 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c  o reasonable val
df20: 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ues.*/.#if SQLIT
df30: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30  E_MAX_LENGTH<100
df40: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
df50: 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  MAX_LENGTH must 
df60: 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
df70: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
df80: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
df90: 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
dfa0: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
dfb0: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
dfc0: 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23  ast 100.#endif.#
dfd0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  if SQLITE_MAX_SQ
dfe0: 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f  L_LENGTH>SQLITE_
dff0: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72  MAX_LENGTH.# err
e000: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
e010: 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f  L_LENGTH must no
e020: 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
e030: 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  n SQLITE_MAX_LEN
e040: 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  GTH.#endif.#if S
e050: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
e060: 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72  ND_SELECT<2.# er
e070: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
e080: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d  OMPOUND_SELECT m
e090: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
e0a0: 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  2.#endif.#if SQL
e0b0: 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c  ITE_MAX_VDBE_OP<
e0c0: 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  40.# error SQLIT
e0d0: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75  E_MAX_VDBE_OP mu
e0e0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34  st be at least 4
e0f0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
e100: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
e110: 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45  _ARG<0 || SQLITE
e120: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
e130: 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53  G>1000.# error S
e140: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
e150: 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62  ON_ARG must be b
e160: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30  etween 0 and 100
e170: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
e180: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
e190: 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
e1a0: 5f 41 54 54 41 43 48 45 44 3e 36 32 0a 23 20 65  _ATTACHED>62.# e
e1b0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
e1c0: 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65  ATTACHED must be
e1d0: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 36   between 0 and 6
e1e0: 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  2.#endif.#if SQL
e1f0: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
e200: 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20  TERN_LENGTH<1.# 
e210: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
e220: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
e230: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
e240: 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
e250: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
e260: 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72  LUMN>32767.# err
e270: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
e280: 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78  LUMN must not ex
e290: 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69  ceed 32767.#endi
e2a0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
e2b0: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31  _TRIGGER_DEPTH<1
e2c0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
e2d0: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
e2e0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
e2f0: 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  st 1.#endif.../*
e300: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
e310: 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e  alue of a limit.
e320: 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64    Report the old
e330: 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e   value..** If an
e340: 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69   invalid limit i
e350: 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64  ndex is supplied
e360: 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20  , report -1..** 
e370: 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
e380: 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74  but still report
e390: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69   the old value i
e3a0: 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d  f the.** new lim
e3b0: 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
e3c0: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65  **.** A new lowe
e3d0: 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74  r limit does not
e3e0: 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67   shrink existing
e3f0: 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20   constructs..** 
e400: 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e  It merely preven
e410: 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74  ts new construct
e420: 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68  s that exceed th
e430: 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20  e limit.** from 
e440: 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  forming..*/.int 
e450: 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71  sqlite3_limit(sq
e460: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c  lite3 *db, int l
e470: 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c  imitId, int newL
e480: 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64  imit){.  int old
e490: 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56  Limit;...  /* EV
e4a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
e4b0: 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
e4c0: 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
e4d0: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
e4e0: 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
e4f0: 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
e500: 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
e510: 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
e520: 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
e530: 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
e540: 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
e550: 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
e560: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
e570: 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
e580: 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
e590: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
e5a0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
e5b0: 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
e5c0: 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
e5d0: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
e5e0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
e5f0: 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
e600: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
e610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
e620: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
e630: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
e640: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
e650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
e660: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
e670: 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
e680: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
e690: 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
e6a0: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
e6b0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
e6c0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
e6d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
e6e0: 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
e6f0: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
e700: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
e710: 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
e720: 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
e730: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
e740: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
e750: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
e760: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
e770: 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
e780: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
e790: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
e7a0: 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
e7b0: 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
e7c0: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
e7d0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
e7e0: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
e7f0: 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
e830: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
e840: 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
e850: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
e860: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
e870: 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
e880: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
e890: 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
e8a0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
e8b0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
e8c0: 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
e8d0: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
e8e0: 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
e8f0: 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  ( SQLITE_LIMIT_T
e900: 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d 28 53  RIGGER_DEPTH==(S
e910: 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29  QLITE_N_LIMIT-1)
e920: 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69   );...  if( limi
e930: 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64  tId<0 || limitId
e940: 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  >=SQLITE_N_LIMIT
e950: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
e960: 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69  1;.  }.  oldLimi
e970: 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c  t = db->aLimit[l
e980: 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e  imitId];.  if( n
e990: 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20  ewLimit>=0 ){   
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d  /* IMP: R-52476-
e9c0: 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28  28732 */.    if(
e9d0: 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c   newLimit>aHardL
e9e0: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b  imit[limitId] ){
e9f0: 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20  .      newLimit 
ea00: 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  = aHardLimit[lim
ea10: 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20  itId];  /* IMP: 
ea20: 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f  R-51463-25634 */
ea30: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
ea40: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d  Limit[limitId] =
ea50: 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   newLimit;.  }. 
ea60: 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74   return oldLimit
ea70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ea80: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
ea90: 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d  53341-35419 */.}
eaa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
eab0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
eac0: 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49 73   parse both URIs
ead0: 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   and non-URI fil
eae0: 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62 79  enames passed by
eaf0: 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20   the.** user to 
eb00: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71  API functions sq
eb10: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20  lite3_open() or 
eb20: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
eb30: 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62  ), and for datab
eb40: 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63  ase.** URIs spec
eb50: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
eb60: 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e   ATTACH statemen
eb70: 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ts..**.** The fi
eb80: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
eb90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
eba0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ebb0: 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a   VFS to use (or.
ebc0: 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67  ** a NULL to sig
ebd0: 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c 74  nify the default
ebe0: 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52 49   VFS) if the URI
ebf0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
ec00: 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a  n a "vfs=xxx".**
ec10: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
ec20: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
ec30: 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74  ument contains t
ec40: 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55  he URI (or non-U
ec50: 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20  RI filename).** 
ec60: 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69  itself. When thi
ec70: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ec80: 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73  lled the *pFlags
ec90: 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
eca0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20   contain.** the 
ecb0: 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f  default flags to
ecc0: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
ecd0: 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20  se handle with. 
ece0: 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  The value stored
ecf0: 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d   in.** *pFlags m
ed00: 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62 65  ay be updated be
ed10: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
ed20: 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61  f the URI filena
ed30: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20  me contains .** 
ed40: 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22  "cache=xxx" or "
ed50: 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79 20  mode=xxx" query 
ed60: 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a  parameters..**.*
ed70: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
ed80: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
ed90: 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
eda0: 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20 73  case *ppVfs is s
edb0: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
edc0: 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20 73  * the VFS that s
edd0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  hould be used to
ede0: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
edf0: 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65  se file. *pzFile
ee00: 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f   is set to.** po
ee10: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
ee20: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
ee30: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
ee40: 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74  to open. It is t
ee50: 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
ee60: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
ee70: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
ee80: 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  y call sqlite3_f
ee90: 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65  ree() to release
eea0: 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e  .** this buffer.
eeb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
eec0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
eed0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
eee0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
eef0: 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a   and *pzErrMsg.*
ef00: 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  * may be set to 
ef10: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
ef20: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
ef30: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
ef40: 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
ef50: 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
ef60: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
ef70: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
ef80: 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
ef90: 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
efa0: 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
efb0: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e  e3_free()..*/.in
efc0: 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  t sqlite3ParseUr
efd0: 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i(.  const char 
efe0: 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20  *zDefaultVfs,   
eff0: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
f000: 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78  se if no "vfs=xx
f010: 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20  x" query option 
f020: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
f030: 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20 20  *zUri,          
f040: 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
f050: 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70 61  inated URI to pa
f060: 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rse */.  unsigne
f070: 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20  d int *pFlags,  
f080: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
f090: 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  UT: SQLITE_OPEN_
f0a0: 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  XXX flags */.  s
f0b0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56  qlite3_vfs **ppV
f0c0: 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
f0d0: 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73  * OUT: VFS to us
f0e0: 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70  e */ .  char **p
f0f0: 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  zFile,          
f100: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f110: 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65  Filename compone
f120: 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63  nt of URI */.  c
f130: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f150: 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
f160: 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c  sage (if rc!=SQL
f170: 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20  ITE_OK) */.){.  
f180: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f190: 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  OK;.  unsigned i
f1a0: 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61  nt flags = *pFla
f1b0: 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  gs;.  const char
f1c0: 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c   *zVfs = zDefaul
f1d0: 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46  tVfs;.  char *zF
f1e0: 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  ile;.  char c;. 
f1f0: 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69   int nUri = sqli
f200: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69  te3Strlen30(zUri
f210: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  );..  assert( *p
f220: 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20  zErrMsg==0 );.. 
f230: 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20 53   if( ((flags & S
f240: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
f250: 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
f260: 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29  Config.bOpenUri)
f270: 20 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20   .   && nUri>=5 
f280: 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20  && memcmp(zUri, 
f290: 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a  "file:", 5)==0 .
f2a0: 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a    ){.    char *z
f2b0: 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74  Opt;.    int eSt
f2c0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
f2d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
f2e0: 20 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73   state when pars
f2f0: 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69  ing URI */.    i
f300: 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20  nt iIn;         
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f320: 49 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20  Input character 
f330: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
f340: 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   iOut = 0;      
f350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
f360: 74 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  tput character i
f370: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
f380: 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20  nByte = nUri+2; 
f390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
f3a0: 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61  es of space to a
f3b0: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20  llocate */..    
f3c0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
f3d0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
f3e0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
f3f0: 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20  indicate to the 
f400: 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a  VFS xOpen .    *
f410: 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68  * method that th
f420: 65 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61  ere may be extra
f430: 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c   parameters foll
f440: 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e  owing the file-n
f450: 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61  ame.  */.    fla
f460: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
f470: 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28  N_URI;..    for(
f480: 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b  iIn=0; iIn<nUri;
f490: 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d   iIn++) nByte +=
f4a0: 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27   (zUri[iIn]=='&'
f4b0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  );.    zFile = s
f4c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
f4d0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  yte);.    if( !z
f4e0: 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
f4f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20  LITE_NOMEM;..   
f500: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
f510: 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f  scheme and autho
f520: 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66  rity segments of
f530: 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20   the URI. */.   
f540: 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f   if( zUri[5]=='/
f550: 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f  ' && zUri[6]=='/
f560: 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  ' ){.      iIn =
f570: 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   7;.      while(
f580: 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
f590: 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69  ri[iIn]!='/' ) i
f5a0: 49 6e 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28  In++;..      if(
f5b0: 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
f5c0: 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
f5d0: 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
f5e0: 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
f5f0: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
f600: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
f610: 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
f620: 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
f630: 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
f640: 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
f650: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f660: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
f670: 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
f680: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
f690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 49   }else{.      iI
f6a0: 6e 20 3d 20 35 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 5;.    }..  
f6b0: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69    /* Copy the fi
f6c0: 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71  lename and any q
f6d0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
f6e0: 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62  into the zFile b
f6f0: 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44  uffer. .    ** D
f700: 65 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65  ecode %HH escape
f710: 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65   codes along the
f720: 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20   way. .    **.  
f730: 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73    ** Within this
f740: 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20   loop, variable 
f750: 65 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65  eState may be se
f760: 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20  t to 0, 1 or 2, 
f770: 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a  depending.    **
f780: 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20   on the parsing 
f790: 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c  context. As foll
f7a0: 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ows:.    **.    
f7b0: 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20  **   0: Parsing 
f7c0: 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a  file-name..    *
f7d0: 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e  *   1: Parsing n
f7e0: 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  ame section of a
f7f0: 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
f800: 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
f810: 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67   **   2: Parsing
f820: 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f   value section o
f830: 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
f840: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
f850: 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74      */.    eStat
f860: 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  e = 0;.    while
f870: 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
f880: 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29  )!=0 && c!='#' )
f890: 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20  {.      iIn++;. 
f8a0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20       if( c=='%' 
f8b0: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
f8c0: 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
f8d0: 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26  iIn]) .       &&
f8e0: 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
f8f0: 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20  (zUri[iIn+1]) . 
f900: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
f910: 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c  int octet = (sql
f920: 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
f930: 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b  i[iIn++]) << 4);
f940: 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b  .        octet +
f950: 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e  = sqlite3HexToIn
f960: 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a  t(zUri[iIn++]);.
f970: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f980: 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74   octet>=0 && oct
f990: 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20  et<256 );.      
f9a0: 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29    if( octet==0 )
f9b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
f9c0: 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
f9d0: 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
f9e0: 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
f9f0: 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
fa00: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
fa10: 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
fa20: 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
fa30: 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
fa40: 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
fa50: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
fa60: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
fa70: 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
fa80: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
fa90: 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
faa0: 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
fab0: 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
fac0: 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
fad0: 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
fae0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
faf0: 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
fb00: 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
fb10: 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
fb20: 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
fb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
fb40: 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
fb50: 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
fb60: 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
fb70: 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
fb80: 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
fb90: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
fba0: 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
fbb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
fbc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
fbd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
fbe0: 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65   octet;.      }e
fbf0: 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d  lse if( eState==
fc00: 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20  1 && (c=='&' || 
fc10: 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  c=='=') ){.     
fc20: 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75     if( zFile[iOu
fc30: 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1]==0 ){.     
fc40: 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79       /* An empty
fc50: 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67   option name. Ig
fc60: 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
fc70: 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a   altogether. */.
fc80: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
fc90: 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
fca0: 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20  ri[iIn]!='#' && 
fcb0: 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27  zUri[iIn-1]!='&'
fcc0: 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
fcd0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
fce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fcf0: 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20  if( c=='&' ){.  
fd00: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f          zFile[iO
fd10: 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
fd20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fd30: 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
fd40: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
fd50: 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
fd60: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74    }else if( (eSt
fd70: 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27  ate==0 && c=='?'
fd80: 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20  ) || (eState==2 
fd90: 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20  && c=='&') ){.  
fda0: 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
fdb0: 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
fdc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
fdd0: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63  File[iOut++] = c
fde0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fdf0: 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c  eState==1 ) zFil
fe00: 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
fe10: 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
fe20: 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
fe30: 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
fe40: 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  '\0';..    /* Ch
fe50: 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72  eck if there wer
fe60: 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70  e any options sp
fe70: 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f  ecified that sho
fe80: 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74  uld be interpret
fe90: 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e  ed .    ** here.
fea0: 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   Options that ar
feb0: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65  e interpreted he
fec0: 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22  re include "vfs"
fed0: 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a   and those that.
fee0: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
fef0: 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20  d to flags that 
ff00: 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f  may be passed to
ff10: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65   the sqlite3_ope
ff20: 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65  n_v2().    ** me
ff30: 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70  thod. */.    zOp
ff40: 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74  t = &zFile[sqlit
ff50: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
ff60: 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
ff70: 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20   zOpt[0] ){.    
ff80: 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c    int nOpt = sql
ff90: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
ffa0: 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
ffb0: 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70  zVal = &zOpt[nOp
ffc0: 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  t+1];.      int 
ffd0: 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
ffe0: 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20  rlen30(zVal);.. 
fff0: 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33       if( nOpt==3
10000 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22   && memcmp("vfs"
10010 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b  , zOpt, 3)==0 ){
10020 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20  .        zVfs = 
10030 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zVal;.      }els
10040 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
10050 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
10060 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
10070 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
10080 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
10090 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
100a0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
100b0 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  odeType = 0;.   
100c0 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
100d0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
100e0 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  imit = 0;..     
100f0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26     if( nOpt==5 &
10100 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22  & memcmp("cache"
10110 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b  , zOpt, 5)==0 ){
10120 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
10130 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
10140 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d  e aCacheMode[] =
10150 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
10160 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49   "shared",  SQLI
10170 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
10180 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
10190 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20     { "private", 
101a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
101b0 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
101c0 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
101d0 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
101e0 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
101f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
10200 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f  EDCACHE|SQLITE_O
10210 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
10220 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
10230 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a  e = aCacheMode;.
10240 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
10250 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
10260 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63    zModeType = "c
10270 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d  ache";.        }
10280 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
10290 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==4 && memcmp("
102a0 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d  mode", zOpt, 4)=
102b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
102c0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
102d0 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65  enMode aOpenMode
102e0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
102f0 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49     { "ro",  SQLI
10300 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
10310 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
10320 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f  { "rw",  SQLITE_
10330 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
10340 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  , .            {
10350 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f   "rwc", SQLITE_O
10360 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
10370 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
10380 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  TE },.          
10390 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51    { "memory", SQ
103a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
103b0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
103c0 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
103d0 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
103e0 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
103f0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53  PEN_READONLY | S
10400 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
10410 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
10420 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
10430 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
10440 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
10450 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  Y;.          aMo
10460 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a  de = aOpenMode;.
10470 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
10480 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a  = mask & flags;.
10490 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
104a0 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a  ype = "access";.
104b0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
104c0 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a     if( aMode ){.
104d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
104e0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
104f0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
10500 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64     for(i=0; aMod
10510 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20  e[i].z; i++){.  
10520 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
10530 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b  char *z = aMode[
10540 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  i].z;.          
10550 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69    if( nVal==sqli
10560 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26  te3Strlen30(z) &
10570 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c  & 0==memcmp(zVal
10580 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20  , z, nVal) ){.  
10590 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
105a0 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65   = aMode[i].mode
105b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
105c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
105d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
105e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
105f0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
10600 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
10610 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
10620 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f  f("no such %s mo
10630 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79  de: %s", zModeTy
10640 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
10650 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
10660 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
10670 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
10680 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
10690 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
106a0 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c  if( (mode & ~SQL
106b0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
106c0 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
106d0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
106e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
106f0 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61  f("%s mode not a
10700 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20  llowed: %s",.   
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20       zModeType, 
10740 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
10750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
10760 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERM;.           
10770 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
10780 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
10790 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
107a0 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73   = (flags & ~mas
107b0 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20  k) | mode;.     
107c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
107d0 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c      zOpt = &zVal
107e0 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a  [nVal+1];.    }.
107f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
10800 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
10810 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20  lloc(nUri+2);.  
10820 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
10830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10840 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  EM;.    memcpy(z
10850 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69  File, zUri, nUri
10860 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  );.    zFile[nUr
10870 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  i] = '\0';.    z
10880 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27  File[nUri+1] = '
10890 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  \0';.    flags &
108a0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  = ~SQLITE_OPEN_U
108b0 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66  RI;.  }..  *ppVf
108c0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
108d0 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66  find(zVfs);.  if
108e0 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20  ( *ppVfs==0 ){. 
108f0 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
10900 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10910 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22  no such vfs: %s"
10920 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20  , zVfs);.    rc 
10930 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
10940 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f    }. parse_uri_o
10950 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
10960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
10970 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
10980 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  e);.    zFile = 
10990 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73  0;.  }.  *pFlags
109a0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46   = flags;.  *pzF
109b0 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72  ile = zFile;.  r
109c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
109d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
109e0 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
109f0 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
10a00 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
10a10 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
10a20 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
10a30 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
10a40 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
10a50 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
10a60 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
10a70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10a80 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
10a90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
10aa0 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
10ab0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
10ac0 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
10ad0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
10ae0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
10af0 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
10b00 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
10b10 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
10b20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
10b30 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
10b40 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
10b50 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
10b60 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
10b70 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
10b80 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
10b90 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
10ba0 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
10bb0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
10bc0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10be0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10bf0 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c10 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
10c20 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
10c30 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
10c40 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
10c50 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
10c60 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
10c70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
10c80 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
10c90 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
10ca0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
10cb0 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
10cc0 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
10cd0 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  */..  *ppDb = 0;
10ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10cf0 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
10d00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
10d10 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
10d20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
10d30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e  .#endif..  /* On
10d40 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c  ly allow sensibl
10d50 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  e combinations o
10d60 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c  f bits in the fl
10d70 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  ags argument.  .
10d80 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72    ** Throw an er
10d90 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73  ror if any non-s
10da0 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ense combination
10db0 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65   is used.  If we
10dc0 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f  .  ** do not blo
10dd0 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69  ck illegal combi
10de0 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74  nations here, it
10df0 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20   could trigger. 
10e00 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61   ** assert() sta
10e10 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65  tements in deepe
10e20 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69  r layers.  Sensi
10e30 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
10e40 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a  .  ** are:.  **.
10e50 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45    **  1:  SQLITE
10e60 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20  _OPEN_READONLY. 
10e70 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f   **  2:  SQLITE_
10e80 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
10e90 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f   **  6:  SQLITE_
10ea0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
10eb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
10ec0 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ATE.  */.  asser
10ed0 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
10ee0 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31  EADONLY  == 0x01
10ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
10f00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
10f10 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20  ITE == 0x02 );. 
10f20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
10f30 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d  OPEN_CREATE    =
10f40 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74  = 0x04 );.  test
10f50 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
10f60 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a  &7))==0x02 ); /*
10f70 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74   READONLY */.  t
10f80 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
10f90 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b  ags&7))==0x04 );
10fa0 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f   /* READWRITE */
10fb0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
10fc0 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34  <(flags&7))==0x4
10fd0 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  0 ); /* READWRIT
10fe0 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20  E | CREATE */.  
10ff0 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26  if( ((1<<(flags&
11000 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29  7)) & 0x46)==0 )
11010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
11020 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69  ISUSE_BKPT;..  i
11030 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
11040 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
11050 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68  x==0 ){.    isTh
11060 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
11070 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
11080 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  & SQLITE_OPEN_NO
11090 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
110a0 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
110b0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
110c0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   & SQLITE_OPEN_F
110d0 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  ULLMUTEX ){.    
110e0 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31  isThreadsafe = 1
110f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11100 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71  sThreadsafe = sq
11110 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
11120 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20  g.bFullMutex;.  
11130 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  }.  if( flags & 
11140 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
11150 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
11160 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
11170 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
11180 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
11190 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
111a0 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
111b0 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
111c0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
111d0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
111e0 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
111f0 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
11200 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
11210 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
11220 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
11230 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
11240 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
11250 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
11260 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
11270 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
11280 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
11290 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
112a0 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
112b0 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
112c0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
112d0 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
112e0 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
112f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11300 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ITE, SQLITE_OPEN
11310 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f  _CREATE, SQLITE_
11320 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
11330 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
11340 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c  EN_PRIVATECACHE,
11350 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76   and some reserv
11360 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74  ed bits.  Silent
11370 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66  ly mask.  ** off
11380 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
11390 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26  ..  */.  flags &
113a0 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45  =  ~( SQLITE_OPE
113b0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
113c0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
113d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
113e0 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
113f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11400 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20  PEN_MAIN_DB |.  
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
11420 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
11430 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
11440 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
11450 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20  RANSIENT_DB | . 
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11470 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
11480 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
11490 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
114a0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
114b0 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
114c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
114d0 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  SUBJOURNAL | .  
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
114f0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
11500 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20  JOURNAL |.      
11510 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11520 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20  OPEN_NOMUTEX |. 
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11540 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
11550 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
11560 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11570 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  _WAL.           
11580 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    );..  /* Alloc
11590 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
115a0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
115b0 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
115c0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
115d0 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
115e0 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
115f0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69   opendb_out;.  i
11600 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20  f( isThreadsafe 
11610 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78  ){.    db->mutex
11620 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
11630 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
11640 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
11650 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d    if( db->mutex=
11660 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11670 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
11680 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
11690 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
116a0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
116b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
116c0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
116d0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30   db->errMask = 0
116e0 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  xff;.  db->nDb =
116f0 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   2;.  db->magic 
11700 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
11710 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d  USY;.  db->aDb =
11720 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
11730 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
11740 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73  f(db->aLimit)==s
11750 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74  izeof(aHardLimit
11760 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62  ) );.  memcpy(db
11770 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c  ->aLimit, aHardL
11780 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d  imit, sizeof(db-
11790 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d  >aLimit));.  db-
117a0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
117b0 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76  .  db->nextAutov
117c0 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e  ac = -1;.  db->n
117d0 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
117e0 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
117f0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
11800 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 41 75  ames | SQLITE_Au
11810 74 6f 49 6e 64 65 78 20 7c 20 53 51 4c 49 54 45  toIndex | SQLITE
11820 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 0a 23  _EnableTrigger.#
11830 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
11840 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a  T_FILE_FORMAT<4.
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   | SQLITE_Legacy
11870 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23  FileFmt.#endif.#
11880 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11890 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
118a0 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
118b0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61      | SQLITE_Loa
118c0 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69  dExtension.#endi
118d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
118e0 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54  AULT_RECURSIVE_T
118f0 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20  RIGGERS.        
11900 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
11910 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65  E_RecTriggers.#e
11920 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
11930 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
11940 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26  FOREIGN_KEYS) &&
11950 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
11960 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20  FOREIGN_KEYS.   
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
11980 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
11990 79 73 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ys.#endif.      
119a0 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ;.  sqlite3HashI
119b0 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  nit(&db->aCollSe
119c0 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
119d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
119e0 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61  ABLE.  sqlite3Ha
119f0 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64  shInit(&db->aMod
11a00 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
11a10 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75  /* Add the defau
11a20 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
11a30 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49  uence BINARY. BI
11a40 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62  NARY works for b
11a50 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61  oth UTF-8.  ** a
11a60 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64  nd UTF-16, so ad
11a70 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  d a version for 
11a80 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e  each to avoid an
11a90 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20  y unnecessary.  
11aa0 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20  ** conversions. 
11ab0 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74  The only error t
11ac0 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65  hat can occur he
11ad0 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29  re is a malloc()
11ae0 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20   failure..  */. 
11af0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
11b00 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
11b10 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62  QLITE_UTF8, 0, b
11b20 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
11b30 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
11b40 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
11b50 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
11b60 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
11b70 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
11b80 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
11b90 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  Y", SQLITE_UTF16
11ba0 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  LE, 0, binCollFu
11bb0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
11bc0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52  Collation(db, "R
11bd0 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54  TRIM", SQLITE_UT
11be0 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69  F8, (void*)1, bi
11bf0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
11c00 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11c10 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
11c20 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
11c30 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  }.  db->pDfltCol
11c40 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
11c50 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
11c60 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22  E_UTF8, "BINARY"
11c70 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
11c80 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30  db->pDfltColl!=0
11c90 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61   );..  /* Also a
11ca0 64 64 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d  dd a UTF-8 case-
11cb0 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c  insensitive coll
11cc0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20  ation sequence. 
11cd0 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  */.  createColla
11ce0 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45  tion(db, "NOCASE
11cf0 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
11d00 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  0, nocaseCollati
11d10 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f  ngFunc, 0);..  /
11d20 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65  * Parse the file
11d30 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e  name/URI argumen
11d40 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  t. */.  db->open
11d50 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
11d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72   rc = sqlite3Par
11d70 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c  seUri(zVfs, zFil
11d80 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26  ename, &flags, &
11d90 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e  db->pVfs, &zOpen
11da0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
11db0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11dc0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
11dd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64  SQLITE_NOMEM ) d
11de0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11df0 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
11e00 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 7a 45  Error(db, rc, zE
11e10 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
11e20 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
11e30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
11e40 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20  rMsg);.    goto 
11e50 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
11e60 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62  .  /* Open the b
11e70 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20  ackend database 
11e80 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d  driver */.  rc =
11e90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
11ea0 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65  n(db->pVfs, zOpe
11eb0 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b  n, db, &db->aDb[
11ec0 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20  0].pBt, 0,.     
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54     flags | SQLIT
11ef0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b  E_OPEN_MAIN_DB);
11f00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11f10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
11f20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
11f30 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
11f40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11f50 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  M;.    }.    sql
11f60 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
11f70 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  , 0);.    goto o
11f80 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
11f90 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68   db->aDb[0].pSch
11fa0 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
11fb0 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61  emaGet(db, db->a
11fc0 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
11fd0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
11fe0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11ff0 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20  Get(db, 0);...  
12000 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  /* The default s
12010 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
12020 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
12030 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72  e is 'full'; for
12040 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64   the temp.  ** d
12050 61 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e  atabase it is 'N
12060 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68  ONE'. This match
12070 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  es the pager lay
12080 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20  er defaults.  . 
12090 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d   */.  db->aDb[0]
120a0 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  .zName = "main";
120b0 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61  .  db->aDb[0].sa
120c0 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a  fety_level = 3;.
120d0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61    db->aDb[1].zNa
120e0 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
120f0 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
12100 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64  _level = 1;..  d
12110 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
12120 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
12130 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12140 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
12150 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
12160 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
12170 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  all built-in fun
12180 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e  ctions, but do n
12190 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ot attempt to re
121a0 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ad the.  ** data
121b0 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e  base schema yet.
121c0 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64   This is delayed
121d0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
121e0 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
121f0 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73  se.  ** is acces
12200 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
12210 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
12220 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71  ITE_OK, 0);.  sq
12230 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69  lite3RegisterBui
12240 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
12250 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75  );..  /* Load au
12260 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f  tomatic extensio
12270 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20  ns - extensions 
12280 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72  that have been r
12290 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75  egistered.  ** u
122a0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
122b0 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e  _automatic_exten
122c0 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f  sion() API..  */
122d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
122e0 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69  errcode(db);.  i
122f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12300 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   ){.    sqlite3A
12310 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  utoLoadExtension
12320 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  s(db);.    rc = 
12330 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
12340 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  db);.    if( rc!
12350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12360 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
12370 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
12380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12390 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20  ABLE_FTS1.  if( 
123a0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
123b0 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  d ){.    extern 
123c0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49  int sqlite3Fts1I
123d0 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
123e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
123f0 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts1Init(db);.  }
12400 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
12410 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
12420 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S2.  if( !db->ma
12430 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
12440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12450 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
12460 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71  lite3Fts2Init(sq
12470 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
12480 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  = sqlite3Fts2Ini
12490 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
124a0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
124b0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69  _ENABLE_FTS3.  i
124c0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
124d0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
124e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
124f0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  = sqlite3Fts3Ini
12500 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
12510 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
12520 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66  _ENABLE_ICU.  if
12530 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
12540 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
12550 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
12560 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28   sqlite3IcuInit(
12570 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
12580 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12590 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66  NABLE_RTREE.  if
125a0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
125b0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
125c0 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
125d0 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74  sqlite3RtreeInit
125e0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
125f0 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
12600 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20  (db, rc, 0);..  
12610 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  /* -DSQLITE_DEFA
12620 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
12630 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49  =1 makes EXCLUSI
12640 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  VE the default l
12650 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
12660 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  .  -DSQLITE_DEFA
12670 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
12680 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74  =0 make NORMAL t
12690 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
126a0 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44  ng.  ** mode.  D
126b0 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20  oing nothing at 
126c0 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e  all also makes N
126d0 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
126e0 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  t..  */.#ifdef S
126f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
12700 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d  CKING_MODE.  db-
12710 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20  >dfltLockMode = 
12720 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
12730 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73  OCKING_MODE;.  s
12740 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
12750 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74  ngMode(sqlite3Bt
12760 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
12770 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20  [0].pBt),.      
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
127a0 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29  LT_LOCKING_MODE)
127b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  ;.#endif..  /* E
127c0 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73  nable the lookas
127d0 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79  ide-malloc subsy
127e0 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c  stem */.  setupL
127f0 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20  ookaside(db, 0, 
12800 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
12810 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c  fig.szLookaside,
12820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12840 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
12850 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c  okaside);..  sql
12860 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
12870 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49  ckpoint(db, SQLI
12880 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41  TE_DEFAULT_WAL_A
12890 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a  UTOCHECKPOINT);.
128a0 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73  .opendb_out:.  s
128b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65  qlite3_free(zOpe
128c0 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a  n);.  if( db ){.
128d0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
128e0 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68  mutex!=0 || isTh
128f0 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73  readsafe==0 || s
12900 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
12910 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30  ig.bFullMutex==0
12920 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
12930 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12940 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63  mutex);.  }.  rc
12950 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
12960 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  de(db);.  assert
12970 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  ( db!=0 || rc==S
12980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
12990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
129a0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
129b0 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
129c0 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65      db = 0;.  }e
129d0 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
129e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
129f0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
12a00 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a  MAGIC_SICK;.  }.
12a10 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20 20    *ppDb = db;.  
12a20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
12a30 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
12a40 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
12a50 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
12a60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
12a70 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  3_open(.  const 
12a80 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
12a90 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
12aa0 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Db .){.  return 
12ab0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
12ac0 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20  lename, ppDb,.  
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
12af0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
12b00 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
12b10 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
12b20 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e  3_open_v2(.  con
12b30 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
12b40 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e,   /* Database
12b50 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38   filename (UTF-8
12b60 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
12b70 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f  *ppDb,         /
12b80 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62  * OUT: SQLite db
12b90 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
12ba0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
12bb0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f       /* Flags */
12bc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12bd0 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  Vfs        /* Na
12be0 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65  me of VFS module
12bf0 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
12c00 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
12c10 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70  ase(filename, pp
12c20 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  Db, (unsigned in
12c30 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  t)flags, zVfs);.
12c40 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12c50 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
12c60 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
12c70 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
12c80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
12c90 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f  en16(.  const vo
12ca0 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  id *zFilename, .
12cb0 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
12cc0 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
12cd0 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20   *zFilename8;   
12ce0 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63  /* zFilename enc
12cf0 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e  oded in UTF-8 in
12d00 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20  stead of UTF-16 
12d10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
12d20 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
12d30 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a  rc;..  assert( z
12d40 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73  Filename );.  as
12d50 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20  sert( ppDb );.  
12d60 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
12d70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12d80 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
12d90 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
12da0 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
12db0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
12dc0 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  f.  pVal = sqlit
12dd0 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
12de0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12df0 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
12e00 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
12e10 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
12e20 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
12e30 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
12e40 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
12e50 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
12e60 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
12e70 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
12e80 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
12e90 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
12ec0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
12ed0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
12ee0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
12ef0 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
12f00 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
12f10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12f20 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
12f30 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
12f40 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
12f50 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70 44  {.      ENC(*ppD
12f60 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  b) = SQLITE_UTF1
12f70 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20  6NATIVE;.    }. 
12f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
12f90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12fa0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75   }.  sqlite3Valu
12fb0 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
12fc0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
12fd0 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
12fe0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12ff0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
13000 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
13010 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
13020 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
13030 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13040 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
13050 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
13060 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
13070 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
13080 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
13090 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
130a0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
130b0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
130c0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
130d0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
130e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
130f0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13100 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
13110 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
13120 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
13130 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
13140 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
13150 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
13160 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20  mpare, 0);.  rc 
13170 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
13180 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
13190 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
131a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
131b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
131c0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
131d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
131e0 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
131f0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
13200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
13210 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
13220 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
13230 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
13240 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
13250 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
13260 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
13270 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
13280 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
13290 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
132a0 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
132b0 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
132c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
132d0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
132e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
132f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13300 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
13310 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
13320 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
13330 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
13340 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13350 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
13360 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
13370 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
13380 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
13390 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
133a0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
133b0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
133c0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
133d0 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
133e0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
133f0 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
13400 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13410 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
13420 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
13430 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
13440 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
13450 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
13460 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
13470 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
13480 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
13490 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
134a0 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
134b0 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame8;.  sqlite3_
134c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
134d0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
134e0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
134f0 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
13500 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
13510 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
13520 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
13530 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
13540 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
13550 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
13560 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
13570 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
13580 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
13590 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
135a0 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
135b0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
135c0 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
135d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
135e0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
135f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
13600 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13610 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
13620 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
13630 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
13640 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
13650 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
13660 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
13670 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
13680 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
13690 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
136a0 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
136b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
136c0 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
136d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
136e0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
136f0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
13700 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
13710 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
13720 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
13730 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
13740 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
13750 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
13760 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
13770 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
13780 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
13790 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
137a0 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
137b0 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
137c0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
137d0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
137e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
137f0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
13800 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
13810 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
13820 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13830 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
13840 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
13850 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
13860 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
13870 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
13880 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
13890 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
138a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
138b0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
138c0 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
138d0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
138e0 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
138f0 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
13900 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
13910 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
13920 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
13930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
13940 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
13950 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
13960 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
13970 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
13980 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
13990 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
139a0 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
139b0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
139c0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
139d0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
139e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
139f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
13a00 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
13a10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13a20 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
13a30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
13a40 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
13a50 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
13a60 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
13a70 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
13a80 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
13a90 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
13aa0 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
13ab0 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
13ac0 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
13ad0 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
13ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13af0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13b00 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
13b10 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
13b20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13b30 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
13b40 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
13b50 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
13b60 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
13b70 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
13b80 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
13b90 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
13ba0 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
13bb0 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
13bc0 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
13bd0 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
13be0 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
13bf0 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a  ROLLBACK..**.***
13c00 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20  **** THIS IS AN 
13c10 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50 49  EXPERIMENTAL API
13c20 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54 20   AND IS SUBJECT 
13c30 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a  TO CHANGE ******
13c40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
13c50 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
13c60 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
13c70 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
13c80 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
13c90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
13ca0 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69 74  tines are subtit
13cb0 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e  utes for constan
13cc0 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ts SQLITE_CORRUP
13cd0 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  T,.** SQLITE_MIS
13ce0 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  USE, SQLITE_CANT
13cf0 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45  OPEN, SQLITE_IOE
13d00 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  RR and possibly 
13d10 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
13d20 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20  onstants.  They 
13d30 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70 6f  server two purpo
13d40 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
13d50 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
13d60 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
13d70 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
13d80 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
13d90 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
13da0 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
13db0 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
13dc0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
13dd0 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
13de0 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
13df0 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
13e00 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
13e10 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
13e20 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
13e30 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
13e40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
13e50 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
13e60 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
13e70 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
13e80 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
13e90 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
13ea0 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
13eb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ec0 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
13ed0 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20  tion at line %d 
13ee0 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
13ef0 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
13f00 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
13f10 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
13f20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
13f30 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  PT;.}.int sqlite
13f40 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
13f50 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
13f60 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
13f70 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
13f80 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
13f90 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  og(SQLITE_MISUSE
13fa0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13fb0 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65   "misuse at line
13fc0 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
13fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
13fe0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
13ff0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
14000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
14010 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ISUSE;.}.int sql
14020 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f  ite3CantopenErro
14030 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
14040 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
14050 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
14060 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
14070 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
14080 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20  ANTOPEN, .      
14090 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
140a0 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e  open file at lin
140b0 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
140c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
140d0 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
140e0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
140f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14100 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69  CANTOPEN;.}...#i
14110 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14120 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
14130 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
14140 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
14150 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
14160 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
14170 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
14180 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
14190 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
141a0 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
141b0 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
141c0 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
141d0 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
141e0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
141f0 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
14200 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
14210 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
14220 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
14230 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
14240 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
14250 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
14260 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
14270 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
14280 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
14290 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
142a0 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
142b0 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
142c0 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
142d0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23  or details..*/.#
142e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
142f0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
14300 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ATA.int sqlite3_
14310 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
14320 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
14330 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
14340 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
14350 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
14360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
14370 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
14380 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
14390 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
143a0 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
143b0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
143c0 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
143d0 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
143e0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
143f0 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
14400 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
14410 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
14420 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
14430 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
14440 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
14450 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
14460 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14470 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
14480 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
14490 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
144a0 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
144b0 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
144c0 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
144d0 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
144e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
144f0 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
14500 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
14510 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
14520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14530 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
14540 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
14550 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
14560 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
14570 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
14580 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
14590 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
145a0 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a   0;.  int iCol;.
145b0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
145c0 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
145d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
145e0 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
145f0 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
14600 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
14610 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
14620 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75   = 0;..  /* Ensu
14630 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
14640 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
14650 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
14660 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14670 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
14680 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
14690 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
146a0 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
146b0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
146c0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
146d0 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
146e0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
146f0 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
14700 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
14710 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
14720 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
14730 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
14740 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
14750 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
14760 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
14770 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
14780 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
14790 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
147a0 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
147b0 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
147c0 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77  if( sqlite3IsRow
147d0 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  id(zColumnName) 
147e0 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
147f0 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69  ab->iPKey;.    i
14800 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
14810 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
14820 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
14830 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
14840 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
14850 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
14860 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
14870 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
14880 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
14890 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
148a0 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
148b0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
148c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
148d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
148e0 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
148f0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70  >nCol ){.      p
14900 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  Tab = 0;.      g
14910 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
14920 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
14930 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
14940 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
14950 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
14960 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
14970 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
14980 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
14990 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
149a0 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
149b0 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
149c0 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
149d0 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
149e0 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
149f0 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
14a00 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
14a10 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
14a20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
14a30 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
14a40 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
14a50 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
14a60 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
14a70 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
14a80 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
14a90 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
14aa0 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
14ab0 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
14ac0 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
14ad0 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
14ae0 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
14af0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
14b00 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
14b10 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
14b20 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
14b30 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
14b40 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  e = pCol->zType;
14b50 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
14b60 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
14b70 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
14b80 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
14b90 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 70   primarykey  = p
14ba0 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d  Col->isPrimKey!=
14bb0 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d  0;.    autoinc =
14bc0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43   pTab->iPKey==iC
14bd0 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  ol && (pTab->tab
14be0 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
14bf0 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20  ncrement)!=0;.  
14c00 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61  }else{.    zData
14c10 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
14c20 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
14c30 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
14c40 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  !zCollSeq ){.   
14c50 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e   zCollSeq = "BIN
14c60 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72  ARY";.  }..error
14c70 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42  _out:.  sqlite3B
14c80 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
14c90 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  ;..  /* Whether 
14ca0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  the function cal
14cb0 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66  l succeeded or f
14cc0 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f  ailed, set the o
14cd0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
14ce0 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65  .  ** to whateve
14cf0 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f  r their local co
14d00 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61  unterparts conta
14d10 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  in. If an error 
14d20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20  did occur,.  ** 
14d30 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66  this has the eff
14d40 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61  ect of zeroing a
14d50 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ll output parame
14d60 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
14d70 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70   pzDataType ) *p
14d80 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74  zDataType = zDat
14d90 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43  aType;.  if( pzC
14da0 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c  ollSeq ) *pzColl
14db0 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a  Seq = zCollSeq;.
14dc0 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29    if( pNotNull )
14dd0 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74   *pNotNull = not
14de0 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69  null;.  if( pPri
14df0 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d  maryKey ) *pPrim
14e00 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79  aryKey = primary
14e10 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f  key;.  if( pAuto
14e20 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20  inc ) *pAutoinc 
14e30 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66  = autoinc;..  if
14e40 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
14e50 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
14e60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14e70 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
14e80 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
14e90 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f  3MPrintf(db, "no
14ea0 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75   such table colu
14eb0 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62  mn: %s.%s", zTab
14ec0 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
14ed0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20  zColumnName);.  
14ee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
14ef0 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
14f00 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
14f10 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29  (zErrMsg?"%s":0)
14f20 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
14f30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14f40 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d  zErrMsg);.  rc =
14f50 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
14f60 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
14f70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
14f80 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
14f90 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
14fa0 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
14fb0 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
14fc0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
14fd0 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
14fe0 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
14ff0 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29  e3_sleep(int ms)
15000 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
15010 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVfs;.  int rc;
15020 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65  .  pVfs = sqlite
15030 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
15040 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72   if( pVfs==0 ) r
15050 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
15060 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
15070 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e  ks in millisecon
15080 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65  ds, but the unde
15090 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29  rlying OsSleep()
150a0 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20   .  ** API uses 
150b0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65  microseconds. He
150c0 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a  nce the 1000's..
150d0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c    */.  rc = (sql
150e0 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73  ite3OsSleep(pVfs
150f0 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29  , 1000*ms)/1000)
15100 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15110 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
15120 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78  r disable the ex
15130 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f  tended result co
15140 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  des..*/.int sqli
15150 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
15160 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65  ult_codes(sqlite
15170 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66  3 *db, int onoff
15180 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
15190 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
151a0 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
151b0 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
151c0 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
151d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
151e0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
151f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15200 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
15210 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
15220 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
15230 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
15240 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
15250 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
15260 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
15270 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
15280 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
15290 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
152a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
152b0 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  OR;.  Btree *pBt
152c0 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ree;..  sqlite3_
152d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
152e0 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65  mutex);.  pBtree
152f0 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
15300 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
15310 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72  ame);.  if( pBtr
15320 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  ee ){.    Pager 
15330 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  *pPager;.    sql
15340 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20  ite3_file *fd;. 
15350 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
15360 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
15370 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
15380 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
15390 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ree);.    assert
153a0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
153b0 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50     fd = sqlite3P
153c0 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29  agerFile(pPager)
153d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 64  ;.    assert( fd
153e0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  !=0 );.    if( o
153f0 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
15400 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  FILE_POINTER ){.
15410 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f        *(sqlite3_
15420 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64  file**)pArg = fd
15430 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
15440 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
15450 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f  e if( fd->pMetho
15460 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ds ){.      rc =
15470 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15480 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41  ntrol(fd, op, pA
15490 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rg);.    }else{.
154a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
154b0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20  E_NOTFOUND;.    
154c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
154d0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
154e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
154f0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
15500 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
15510 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rc;   .}../*.** 
15520 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  Interface to the
15530 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a   testing logic..
15540 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
15550 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20  est_control(int 
15560 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20  op, ...){.  int 
15570 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rc = 0;.#ifndef 
15580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
15590 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69  TIN_TEST.  va_li
155a0 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
155b0 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
155c0 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
155d0 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
155e0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
155f0 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
15600 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
15610 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
15620 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
15630 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
15640 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
15650 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15660 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
15670 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
15680 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
15690 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
156a0 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
156b0 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
156c0 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
156d0 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
156e0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
156f0 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
15700 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
15710 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15720 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
15730 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
15740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
15750 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
15760 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15770 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
15780 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52   ** Reset the PR
15790 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75  NG back to its u
157a0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61  ninitialized sta
157b0 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61  te.  The next ca
157c0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
157d0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
157e0 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68  ) will reseed th
157f0 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73  e PRNG using a s
15800 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a  ingle call.    *
15810 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d  * to the xRandom
15820 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74  ness method of t
15830 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a  he default VFS..
15840 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15850 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15860 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20  PRNG_RESET: {.  
15870 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
15880 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20  esetState();.   
15890 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
158a0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
158b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
158c0 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
158d0 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
158e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
158f0 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
15900 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
15910 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
15920 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
15930 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
15940 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
15950 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
15960 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
15970 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
15980 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
15990 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
159a0 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
159b0 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
159c0 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
159d0 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
159e0 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
159f0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
15a00 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
15a10 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
15a20 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
15a30 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
15a40 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
15a50 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
15a60 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
15a70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
15a80 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
15a90 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
15aa0 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
15ab0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15ac0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
15ad0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15ae0 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  (BENIGN_MALLOC_H
15af0 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45  OOKS, xBegin, xE
15b00 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd).    **.    *
15b10 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73  * Register hooks
15b20 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69   to call to indi
15b30 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f  cate which mallo
15b40 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20  c() failures .  
15b50 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e    ** are benign.
15b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15b70 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
15b80 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
15b90 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79  OOKS: {.      ty
15ba0 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69  pedef void (*voi
15bb0 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64  d_function)(void
15bc0 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  );.      void_fu
15bd0 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65  nction xBenignBe
15be0 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  gin;.      void_
15bf0 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
15c00 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  End;.      xBeni
15c10 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67  gnBegin = va_arg
15c20 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
15c30 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  on);.      xBeni
15c40 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61  gnEnd = va_arg(a
15c50 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
15c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15c70 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b  BenignMallocHook
15c80 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20  s(xBenignBegin, 
15c90 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20  xBenignEnd);.   
15ca0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15cb0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
15cc0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
15cd0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
15ce0 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
15cf0 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  E, unsigned int 
15d00 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
15d10 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47   Set the PENDING
15d20 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c   byte to the val
15d30 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ue in the argume
15d40 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20  nt, if X>0..    
15d50 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
15d60 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74  es if X==0.  Ret
15d70 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
15d80 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74   the pending byt
15d90 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65  e.    ** as it e
15da0 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74  xisting before t
15db0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
15dc0 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  called..    **. 
15dd0 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a     ** IMPORTANT:
15de0 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
15df0 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d  ENDING byte from
15e00 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75   0x40000000 resu
15e10 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e  lts in.    ** an
15e20 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61   incompatible da
15e30 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d  tabase file form
15e40 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68  at.  Changing th
15e50 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20  e PENDING byte. 
15e60 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20     ** while any 
15e70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
15e80 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75  ion is open resu
15e90 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64  lts in undefined
15ea0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65   and.    ** dile
15eb0 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72  terious behavior
15ec0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15ed0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15ee0 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20  L_PENDING_BYTE: 
15ef0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e  {.      rc = PEN
15f00 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64  DING_BYTE;.#ifnd
15f10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
15f20 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  SD.      {.     
15f30 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
15f40 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28  newVal = va_arg(
15f50 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ap, unsigned int
15f60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
15f70 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50  ewVal ) sqlite3P
15f80 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77  endingByte = new
15f90 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Val;.      }.#en
15fa0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
15fb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
15fc0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
15fd0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
15fe0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
15ff0 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  RT, int X).    *
16000 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
16010 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
16020 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
16030 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
16040 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  not.    ** asser
16050 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20  t() was enabled 
16060 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
16070 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
16080 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20  nd assert().    
16090 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ** is enabled, t
160a0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
160b0 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49  alue is true.  I
160c0 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a  f X is true and.
160d0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
160e0 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
160f0 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
16100 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20  ue is zero.  If 
16110 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73  X is.    ** fals
16120 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
16130 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
16140 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69  the assertion fi
16150 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20  res and the.    
16160 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74  ** process abort
16170 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73  s.  If X is fals
16180 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
16190 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
161a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75   the.    ** retu
161b0 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
161c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
161d0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
161e0 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20  L_ASSERT: {.    
161f0 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78    volatile int x
16200 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
16210 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67 28  rt( (x = va_arg(
16220 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20  ap,int))!=0 );. 
16230 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20       rc = x;.   
16240 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16250 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
16260 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
16270 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
16280 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e  TCTRL_ALWAYS, in
16290 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
162a0 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
162b0 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
162c0 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68  me test to see h
162d0 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e  ow the ALWAYS an
162e0 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d  d.    ** NEVER m
162f0 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e  acros were defin
16300 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
16310 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  me..    **.    *
16320 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
16330 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e  ue is ALWAYS(X).
16340 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
16350 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64   The recommended
16360 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20   test is X==2.  
16370 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
16380 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d  lue is 2, that m
16390 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41  eans.    ** ALWA
163a0 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
163b0 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20   are both no-op 
163c0 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
163d0 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68  ros, which is th
163e0 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
163f0 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68   setting.  If th
16400 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
16410 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53  s 1, then ALWAYS
16420 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20  () is either.   
16430 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74   ** hard-coded t
16440 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69  o true or else i
16450 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73  t asserts if its
16460 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
16470 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  se..    ** The f
16480 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68  irst behavior (h
16490 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
164a0 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
164b0 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
164c0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
164d0 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
164e0 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20  t() is disabled 
164f0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  and the second. 
16500 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28     ** behavior (
16510 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72  assert if the ar
16520 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53  gument to ALWAYS
16530 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20  () is false) is 
16540 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
16550 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
16560 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
16570 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
16580 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a   enabled..    **
16590 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d  .    ** The run-
165a0 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64  time test proced
165b0 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73  ure might look s
165c0 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
165d0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
165e0 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  *    if( sqlite3
165f0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
16600 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
16610 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20  WAYS, 2)==2 ){. 
16620 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
16630 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
16640 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73  () are no-op pas
16650 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
16660 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
16670 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
16680 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
16690 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
166a0 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20  , 1) ){.    **  
166b0 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
166c0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20   asserts that x 
166d0 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78  is true. NEVER(x
166e0 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66  ) asserts x is f
166f0 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20  alse..    **    
16700 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20  }else{.    **   
16710 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
16720 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e  is a constant 1.
16730 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20    NEVER(x) is a 
16740 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20  constant 0..    
16750 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20  **    }.    */. 
16760 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
16770 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20  ESTCTRL_ALWAYS: 
16780 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
16790 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
167a0 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59        rc = ALWAY
167b0 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  S(x);.      brea
167c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
167d0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
167e0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
167f0 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
16800 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
16810 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
16820 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
16830 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
16840 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
16850 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
16860 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
16870 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
16880 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
16890 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
168a0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
168b0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
168c0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
168d0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
168e0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
168f0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
16900 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
16910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16920 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
16930 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
16940 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
16950 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
16960 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
16970 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16980 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
16990 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
169a0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
169b0 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
169c0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
169d0 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
169e0 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
169f0 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
16a00 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
16a10 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
16a20 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
16a30 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
16a40 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
16a50 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
16a60 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
16a70 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
16a80 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
16a90 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
16aa0 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
16ab0 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
16ac0 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
16ad0 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
16ae0 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
16af0 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
16b00 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
16b10 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
16b20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
16b30 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
16b40 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
16b50 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
16b60 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
16b70 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
16b80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
16b90 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
16ba0 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
16bb0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
16bc0 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
16bd0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
16be0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
16bf0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
16c00 20 3d 20 28 78 20 26 20 53 51 4c 49 54 45 5f 4f   = (x & SQLITE_O
16c10 70 74 4d 61 73 6b 29 20 7c 20 28 64 62 2d 3e 66  ptMask) | (db->f
16c20 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
16c30 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 62  ptMask);.      b
16c40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
16c50 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
16c60 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69  WORD.    /* sqli
16c70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
16c80 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
16c90 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73  _ISKEYWORD, cons
16ca0 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20  t char *zWord). 
16cb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
16cc0 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f  zWord is a keywo
16cd0 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79  rd recognized by
16ce0 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
16cf0 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20  n return the.   
16d00 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65   ** number of ke
16d10 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a  ywords.  Or if z
16d20 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65  Word is not a ke
16d30 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e  yword, return 0.
16d40 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
16d50 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72  This test featur
16d60 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
16d70 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67  ble in the amalg
16d80 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20  amation since.  
16d90 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
16da0 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20  N_KEYWORD macro 
16db0 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69  is not defined i
16dc0 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53  n this file if S
16dd0 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20  QLite.    ** is 
16de0 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61  built using sepa
16df0 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65  rate source file
16e00 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
16e10 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
16e20 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a  RL_ISKEYWORD: {.
16e30 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
16e40 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67   *zWord = va_arg
16e50 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
16e60 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
16e70 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16e80 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72  (zWord);.      r
16e90 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77  c = (sqlite3Keyw
16ea0 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f  ordCode((u8*)zWo
16eb0 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f  rd, n)!=TK_ID) ?
16ec0 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
16ed0 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  D : 0;.      bre
16ee0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16ef0 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65   ..    /* sqlite
16f00 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
16f10 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
16f20 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a  CRATCHMALLOC, sz
16f30 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29 3b  , &pNew, pFree);
16f40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50  .    **.    ** P
16f50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20 73  ass pFree into s
16f60 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
16f70 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e(). .    ** If 
16f80 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61  sz>0 then alloca
16f90 74 65 20 61 20 73 63 72 61 74 63 68 20 62 75 66  te a scratch buf
16fa0 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20  fer into pNew.  
16fb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16fc0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
16fd0 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20  _SCRATCHMALLOC: 
16fe0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 46  {.      void *pF
16ff0 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20  ree, **ppNew;.  
17000 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
17010 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70    sz = va_arg(ap
17020 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 70  , int);.      pp
17030 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  New = va_arg(ap,
17040 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20   void**);.      
17050 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28 61  pFree = va_arg(a
17060 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
17070 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65 77   if( sz ) *ppNew
17080 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
17090 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20  hMalloc(sz);.   
170a0 20 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63     sqlite3Scratc
170b0 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  hFree(pFree);.  
170c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
170d0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
170e0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
170f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
17100 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
17110 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20   int onoff);.   
17120 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61   **.    ** If pa
17130 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73  rameter onoff is
17140 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69   non-zero, confi
17150 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65 72  gure the wrapper
17160 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20  s so that all.  
17170 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
17180 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69  calls to localti
17190 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74  me() and variant
171a0 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66  s fail. If onoff
171b0 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a   is zero,.    **
171c0 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69   undo this setti
171d0 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
171e0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
171f0 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
17200 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULT: {.      sql
17210 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17220 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74  .bLocaltimeFault
17230 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
17240 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
17250 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69  .    }..#if defi
17260 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
17270 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
17280 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
17290 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
172a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58  LITE_TESTCTRL_EX
172b0 50 4c 41 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20  PLAIN_STMT,.    
172c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
172d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
172e0 33 5f 73 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68  3_stmt*,const ch
172f0 61 72 2a 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  ar**);.    **.  
17300 20 20 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64    ** If compiled
17310 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45 4e 41   with SQLITE_ENA
17320 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
17330 2c 20 65 61 63 68 20 73 71 6c 69 74 65 33 5f 73  , each sqlite3_s
17340 74 6d 74 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a  tmt holds.    **
17350 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
17360 65 73 63 72 69 62 65 73 20 74 68 65 20 6f 70 74  escribes the opt
17370 69 6d 69 7a 65 64 20 70 61 72 73 65 20 74 72 65  imized parse tre
17380 65 2e 20 20 54 68 69 73 20 74 65 73 74 2d 63 6f  e.  This test-co
17390 6e 74 72 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74  ntrol.    ** ret
173a0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
173b0 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 20  o that string.. 
173c0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
173d0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45  QLITE_TESTCTRL_E
173e0 58 50 4c 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20  XPLAIN_STMT: {. 
173f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
17400 74 20 2a 70 53 74 6d 74 20 3d 20 76 61 5f 61 72  t *pStmt = va_ar
17410 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 73 74  g(ap, sqlite3_st
17420 6d 74 2a 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  mt*);.      cons
17430 74 20 63 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d  t char **pzRet =
17440 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
17450 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20  t char**);.     
17460 20 2a 70 7a 52 65 74 20 3d 20 73 71 6c 69 74 65   *pzRet = sqlite
17470 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
17480 28 28 56 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a  ((Vdbe*)pStmt);.
17490 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
174a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 0a 20   }.#endif..  }. 
174b0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
174c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
174d0 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
174e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
174f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
17500 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69   a utility routi
17510 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46  ne, useful to VF
17520 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
17530 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a  s, that checks.*
17540 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61  * to see if a da
17550 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20  tabase file was 
17560 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61  a URI that conta
17570 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20  ined a specific 
17580 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65  query .** parame
17590 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f  ter, and if so o
175a0 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  btains the value
175b0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61   of the query pa
175c0 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
175d0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
175e0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c  ument is the fil
175f0 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61  ename pointer pa
17600 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f  ssed into the xO
17610 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  pen().** method 
17620 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65  of a VFS impleme
17630 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50  ntation.  The zP
17640 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73  aram argument is
17650 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17660 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
17670 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68  ter we seek.  Th
17680 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
17690 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
176a0 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61  the zParam.** pa
176b0 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78  rameter if it ex
176c0 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61  ists.  If the pa
176d0 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
176e0 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75   exist, this rou
176f0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
17700 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
17710 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
17720 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
17730 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  eter(const char 
17740 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
17750 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b  t char *zParam){
17760 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
17770 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17780 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
17790 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
177a0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
177b0 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d   while( zFilenam
177c0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
177d0 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  x = strcmp(zFile
177e0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
177f0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
17800 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17810 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
17820 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72      if( x==0 ) r
17830 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
17840 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
17850 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17860 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
17870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
17880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17890 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  n a boolean valu
178a0 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
178b0 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rameter..*/.int 
178c0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
178d0 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ean(const char *
178e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
178f0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69   char *zParam, i
17900 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e  nt bDflt){.  con
17910 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
17920 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
17930 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
17940 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d  aram);.  bDflt =
17950 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74   bDflt!=0;.  ret
17960 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47  urn z ? sqlite3G
17970 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66  etBoolean(z, bDf
17980 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a  lt) : bDflt;.}..
17990 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36  /*.** Return a 6
179a0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
179b0 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
179c0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71  parameter..*/.sq
179d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
179e0 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20  te3_uri_int64(. 
179f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
17a00 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69  lename,    /* Fi
17a10 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64  lename as passed
17a20 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63   to xOpen */.  c
17a30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
17a40 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20  m,       /* URI 
17a50 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74  parameter sought
17a60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
17a70 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20  t64 bDflt       
17a80 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72  /* return if par
17a90 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e  ameter is missin
17aa0 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  g */.){.  const 
17ab0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
17ac0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
17ad0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
17ae0 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  m);.  sqlite3_in
17af0 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26  t64 v;.  if( z &
17b00 26 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  & sqlite3Atoi64(
17b10 7a 2c 20 26 76 2c 20 73 71 6c 69 74 65 33 53 74  z, &v, sqlite3St
17b20 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
17b30 45 5f 55 54 46 38 29 3d 3d 53 51 4c 49 54 45 5f  E_UTF8)==SQLITE_
17b40 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20  OK ){.    bDflt 
17b50 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = v;.  }.  retur
17b60 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bDflt;.}../*.*
17b70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72  * Return the Btr
17b80 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74  ee pointer ident
17b90 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65  ified by zDbName
17ba0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
17bb0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
17bc0 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62  Btree *sqlite3Db
17bd0 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69  NameToBtree(sqli
17be0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
17bf0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
17c00 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
17c10 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
17c20 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
17c30 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20  aDb[i].pBt.     
17c40 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c  && (zDbName==0 |
17c50 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
17c60 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  (zDbName, db->aD
17c70 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a  b[i].zName)==0).
17c80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
17c90 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  urn db->aDb[i].p
17ca0 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  Bt;.    }.  }.  
17cb0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
17cc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
17cd0 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
17ce0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
17cf0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
17d00 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
17d10 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
17d20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
17d30 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
17d40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
17d50 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
17d60 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
17d70 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
17d80 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
17d90 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
17da0 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
17db0 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  pBt) : 0;.}../*.
17dc0 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64  ** Return 1 if d
17dd0 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
17de0 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61  only or 0 if rea
17df0 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e  d/write.  Return
17e00 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63   -1 if.** no suc
17e10 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  h database exist
17e20 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
17e30 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71  3_db_readonly(sq
17e40 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
17e50 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
17e60 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20  .  Btree *pBt = 
17e70 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
17e80 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
17e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
17ea0 3f 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ? sqlite3PagerIs
17eb0 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33  readonly(sqlite3
17ec0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
17ed0 20 3a 20 2d 31 3b 0a 7d 0a                        : -1;.}.