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

Artifact acab639c93295650b9ef056689e8092cfcf49f2a:


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 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69   Initialize SQLi
0a10: 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  te.  .**.** This
0a20: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
0a30: 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69   called to initi
0a40: 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
0a50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20   allocation,.** 
0a60: 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73  VFS, and mutex s
0a70: 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20  ubsystems prior 
0a80: 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72  to doing any ser
0a90: 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a  ious work with.*
0aa0: 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61  * SQLite.  But a
0ab0: 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f  s long as you do
0ac0: 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74   not compile wit
0ad0: 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  h SQLITE_OMIT_AU
0ae0: 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72  TOINIT.** this r
0af0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
0b00: 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61  alled automatica
0b10: 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69  lly by key routi
0b20: 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73  nes such as.** s
0b30: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20  qlite3_open().  
0b40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0b50: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65  ine is a no-op e
0b60: 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72  xcept on its ver
0b70: 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72  y first call for
0b80: 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a   the process,.**
0b90: 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72 73   or for the firs
0ba0: 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63  t call after a c
0bb0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
0bc0: 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54  hutdown..**.** T
0bd0: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
0be0: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  to call this rou
0bf0: 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e  tine runs the in
0c00: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a  itialization to.
0c10: 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  ** completion.  
0c20: 49 66 20 73 75 62 73 65 71 75 65 6e 74 20 74 68  If subsequent th
0c30: 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20  reads call this 
0c40: 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74  routine before t
0c50: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65  he first.** thre
0c60: 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ad has finished 
0c70: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0c80: 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e  on process, then
0c90: 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a   the subsequent.
0ca0: 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74 20  ** threads must 
0cb0: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  block until the 
0cc0: 66 69 72 73 74 20 74 68 72 65 61 64 20 66 69 6e  first thread fin
0cd0: 69 73 68 65 73 20 77 69 74 68 20 74 68 65 20 69  ishes with the i
0ce0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a  nitialization..*
0cf0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0d00: 68 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c  hread might call
0d10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
0d20: 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75  cursively.  Recu
0d30: 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74  rsive.** calls t
0d40: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  o this routine s
0d50: 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c  hould not block,
0d60: 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68   of course.  Oth
0d70: 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e  erwise the.** in
0d80: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
0d90: 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72  cess would never
0da0: 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a   complete..**.**
0db0: 20 4c 65 74 20 58 20 62 65 20 74 68 65 20 66 69   Let X be the fi
0dc0: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e  rst thread to en
0dd0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
0de0: 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65  .  Let Y be some
0df0: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64   other.** thread
0e00: 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68  .  Then while th
0e10: 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61  e initial invoca
0e20: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75  tion of this rou
0e30: 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20  tine by X is.** 
0e40: 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69  incomplete, it i
0e50: 73 20 72 65 71 75 69 72 65 64 20 74 68 61 74 3a  s required that:
0e60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c  .**.**    *  Cal
0e70: 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ls to this routi
0e80: 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62  ne from Y must b
0e90: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f  lock until the o
0ea0: 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20  uter-most.**    
0eb0: 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d     call by X com
0ec0: 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pletes..**.**   
0ed0: 20 2a 20 20 52 65 63 75 72 73 69 76 65 20 63 61   *  Recursive ca
0ee0: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
0ef0: 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20  ine from thread 
0f00: 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  X return immedia
0f10: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69  tely.**       wi
0f20: 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a  thout blocking..
0f30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  */.int sqlite3_i
0f40: 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b  nitialize(void){
0f50: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
0f60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
0f70: 4d 61 73 74 65 72 3b 20 29 20 20 20 20 20 20 20  Master; )       
0f80: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74  /* The main stat
0f90: 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e  ic mutex */.  in
0fa0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
0fd0: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  sult code */..#i
0fe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0ff0: 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69  _WSD.  rc = sqli
1000: 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39  te3_wsd_init(409
1010: 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63  6, 24);.  if( rc
1020: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1030: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1040: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1050: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
1060: 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  ady completely i
1070: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
1080: 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20   this call.  ** 
1090: 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  to sqlite3_initi
10a0: 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62  alize() should b
10b0: 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  e a no-op.  But 
10c0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
10d0: 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  on.  ** must be 
10e0: 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73  complete.  So is
10f0: 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65  Init must not be
1100: 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76   set until the v
1110: 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ery end.  ** of 
1120: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20  this routine..  
1130: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1140: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1150: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
1160: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61  ITE_OK;..  /* Ma
1170: 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75 74 65  ke sure the mute
1180: 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69  x subsystem is i
1190: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20  nitialized.  If 
11a0: 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20  unable to .  ** 
11b0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
11c0: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20  utex subsystem, 
11d0: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74  return early wit
11e0: 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a  h the error..  *
11f0: 2a 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20  * If the system 
1200: 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20  is so sick that 
1210: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1220: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65   allocate a mute
1230: 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  x,.  ** there is
1240: 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65   not much SQLite
1250: 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20   is going to be 
1260: 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a  able to do..  **
1270: 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  .  ** The mutex 
1280: 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74  subsystem must t
1290: 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72 69  ake care of seri
12a0: 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a  alizing its own.
12b0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74    ** initializat
12c0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
12d0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69   sqlite3MutexIni
12e0: 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  t();.  if( rc ) 
12f0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1300: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1310: 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20  malloc() system 
1320: 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69 76  and the recursiv
1330: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1340: 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70  ex..  ** This op
1350: 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65  eration is prote
1360: 63 74 65 64 20 62 79 20 74 68 65 20 53 54 41 54  cted by the STAT
1370: 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e  IC_MASTER mutex.
1380: 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
1390: 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73   MutexAlloc() is
13a0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74   called for a st
13b0: 61 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72  atic mutex prior
13c0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   to initializing
13d0: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   the.  ** malloc
13e0: 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69   subsystem - thi
13f0: 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
1400: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  he allocation of
1410: 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d   a static.  ** m
1420: 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65  utex must not re
1430: 71 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72  quire support fr
1440: 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75  om the malloc su
1450: 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20  bsystem..  */.  
1460: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
1470: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
1480: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1490: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14a0: 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
14b0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
14c0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
14d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
14e0: 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20  MutexInit = 1;. 
14f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1500: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1510: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  ocInit ){.    rc
1520: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1530: 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66  Init();.  }.  if
1540: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1550: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
1560: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
1570: 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  locInit = 1;.   
1580: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1590: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
15a0: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71  utex ){.      sq
15b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15c0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20  g.pInitMutex =. 
15d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15e0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15f0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1600: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
1610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1620: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
1630: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1640: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1650: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1660: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1680: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1690: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
16a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16b0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b  nRefInitMutex++;
16c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
16d0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
16e0: 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63  er);..  /* If rc
16f0: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
1700: 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  K at this point,
1710: 20 74 68 65 6e 20 65 69 74 68 65 72 20 74 68 65   then either the
1720: 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62   malloc.  ** sub
1730: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74  system could not
1740: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1750: 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 66 61  or the system fa
1760: 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
1770: 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d  .  ** the pInitM
1780: 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75  utex mutex. Retu
1790: 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65  rn an error in e
17a0: 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a  ither case.  */.
17b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17d0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17e0: 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  Do the rest of t
17f0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1800: 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75  n under the recu
1810: 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20  rsive mutex so. 
1820: 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c   ** that we will
1830: 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64   be able to hand
1840: 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  le recursive cal
1850: 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ls into.  ** sql
1860: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1870: 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76  ).  The recursiv
1880: 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79  e calls normally
1890: 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20   come through.  
18a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ** sqlite3_os_in
18b0: 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76  it() when it inv
18c0: 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73  okes sqlite3_vfs
18d0: 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74  _register(), but
18e0: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75   other.  ** recu
18f0: 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68  rsive calls migh
1900: 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62  t also be possib
1910: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  le..  **.  ** IM
1920: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1930: 20 52 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53   R-00140-37445 S
1940: 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61  QLite automatica
1950: 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63  lly serializes c
1960: 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  alls.  ** to the
1970: 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73   xInit method, s
1980: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1990: 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74  od need not be t
19a0: 68 72 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a  hreadsafe..  **.
19b0: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
19c0: 6e 67 20 6d 75 74 65 78 20 69 73 20 77 68 61 74  ng mutex is what
19d0: 20 73 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65   serializes acce
19e0: 73 73 20 74 6f 20 74 68 65 20 61 70 70 64 65 66  ss to the appdef
19f0: 20 70 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20   pcache xInit.  
1a00: 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ** methods.  The
1a10: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
1a20: 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20  methods.xInit() 
1a30: 61 6c 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20  all is embedded 
1a40: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c  in the.  ** call
1a50: 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
1a60: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20  eInitialize().. 
1a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1a80: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
1a90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1aa0: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28  nitMutex);.  if(
1ab0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ac0: 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26  nfig.isInit==0 &
1ad0: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
1ae0: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44  ==0 ){.    FuncD
1b00: 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  efHash *pHash = 
1b10: 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48  &GLOBAL(FuncDefH
1b20: 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ash, sqlite3Glob
1b30: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20  alFunctions);.  
1b40: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1b50: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1b60: 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 1;.    memset
1b70: 28 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  (pHash, 0, sizeo
1b80: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46  f(sqlite3GlobalF
1b90: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
1ba0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 47  sqlite3RegisterG
1bb0: 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29  lobalFunctions()
1bc0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1bd0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1be0: 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b  PCacheInit==0 ){
1bf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c00: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c10: 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ize();.    }.   
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1c40: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c50: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31  isPCacheInit = 1
1c60: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1c70: 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20  ite3OsInit();.  
1c80: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1c90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca0: 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65     sqlite3PCache
1cb0: 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71 6c  BufferSetup( sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1cd0: 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20  .pPage, .       
1ce0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1cf0: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73  Config.szPage, s
1d00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1d10: 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  ig.nPage);.     
1d20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d30: 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b  nfig.isInit = 1;
1d40: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1d60: 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  nProgress = 0;. 
1d70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1d80: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
1d90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1da0: 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  itMutex);..  /* 
1db0: 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68  Go back under th
1dc0: 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 61  e static mutex a
1dd0: 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  nd clean up the 
1de0: 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d  recursive.  ** m
1df0: 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20  utex to prevent 
1e00: 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e  a resource leak.
1e10: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1e20: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
1e30: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  ter);.  sqlite3G
1e40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
1e50: 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69  InitMutex--;.  i
1e60: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1e70: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1e80: 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61  utex<=0 ){.    a
1e90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c  ssert( sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
1eb0: 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  nitMutex==0 );. 
1ec0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1ed0: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f  _free(sqlite3Glo
1ee0: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1ef0: 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  utex);.    sqlit
1f00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1f10: 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20  InitMutex = 0;. 
1f20: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1f30: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1f40: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1f50: 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61  lowing is just a
1f60: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f   sanity check to
1f70: 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74   make sure SQLit
1f80: 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20  e has.  ** been 
1f90: 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74  compiled correct
1fa0: 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72  ly.  It is impor
1fb0: 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73  tant to run this
1fc0: 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20   code, but.  ** 
1fd0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
1fe0: 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65   run it too ofte
1ff0: 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50  n and soak up CP
2000: 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a  U cycles for no.
2010: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f    ** reason.  So
2020: 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20   we run it once 
2030: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
2040: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ation..  */.#ifn
2050: 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64  def NDEBUG.#ifnd
2060: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
2070: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
2080: 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  /* This section 
2090: 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22  of code's only "
20a0: 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20 61  output" is via a
20b0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
20c0: 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63  ts. */.  if ( rc
20d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20e0: 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75 36     u64 x = (((u6
20f0: 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20  4)1)<<63)-1;.   
2100: 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61   double y;.    a
2110: 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d  ssert(sizeof(x)=
2120: 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  =8);.    assert(
2130: 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f  sizeof(x)==sizeo
2140: 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  f(y));.    memcp
2150: 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20  y(&y, &x, 8);.  
2160: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2170: 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d  3IsNaN(y) );.  }
2180: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
2190: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e    /* Do extra in
21a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  itialization ste
21b0: 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79 20  ps requested by 
21c0: 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41  the SQLITE_EXTRA
21d0: 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69  _INIT.  ** compi
21e0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a  le-time option..
21f0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2200: 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20  TE_EXTRA_INIT.  
2210: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2220: 4b 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  K && sqlite3Glob
2230: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2240: 29 7b 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54  ){.    int SQLIT
2250: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e  E_EXTRA_INIT(con
2260: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72  st char*);.    r
2270: 63 20 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41  c = SQLITE_EXTRA
2280: 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65  _INIT(0);.  }.#e
2290: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
22a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  c;.}../*.** Undo
22b0: 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
22c0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
22d0: 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20  ze().  Must not 
22e0: 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a  be called while.
22f0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  ** there are out
2300: 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73  standing databas
2310: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2320: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2330: 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20  ons or.** while 
2340: 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69  any part of SQLi
2350: 74 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  te is otherwise 
2360: 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68  in use in any th
2370: 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  read.  This.** r
2380: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  outine is not th
2390: 72 65 61 64 73 61 66 65 2e 20 20 42 75 74 20 69  readsafe.  But i
23a0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76  t is safe to inv
23b0: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
23c0: 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69  .** on when SQLi
23d0: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68  te is already sh
23e0: 75 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c  ut down.  If SQL
23f0: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ite is already s
2400: 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e  hut down.** when
2410: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2420: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74   invoked, then t
2430: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2440: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
2450: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2460: 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a  shutdown(void){.
2470: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2480: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2490: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
24a0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
24b0: 0a 20 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45  .    void SQLITE
24c0: 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28  _EXTRA_SHUTDOWN(
24d0: 76 6f 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54  void);.    SQLIT
24e0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
24f0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ();.#endif.    s
2500: 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b  qlite3_os_end();
2510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2520: 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  et_auto_extensio
2530: 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n();.    sqlite3
2540: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2550: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  nit = 0;.  }.  i
2560: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2570: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2580: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2590: 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e  e3PcacheShutdown
25a0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
25b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
25c0: 61 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20  acheInit = 0;.  
25d0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
25e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
25f0: 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20  llocInit ){.    
2600: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64  sqlite3MallocEnd
2610: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2620: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
2630: 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20 20  llocInit = 0;.  
2640: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2650: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2660: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2670: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2690: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
26a0: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
26b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
26d0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
26e0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
26f0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2700: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2710: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2720: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2730: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2740: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2750: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2760: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2770: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2780: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2790: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
27a0: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
27b0: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
27c0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
27d0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
27e0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
27f0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2800: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2810: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2820: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
2830: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2840: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
2850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
2860: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
2870: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
2880: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
2890: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
28a0: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
28b0: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
28c0: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
28d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
28e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
28f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2900: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
2910: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
2920: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
2930: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
2940: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2950: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
2960: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
2970: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
2980: 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66  ile. .    */.#if
2990: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
29a0: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
29b0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
29c0: 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
29d0: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
29e0: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
29f0: 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d  /* Disable all m
2a00: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2a10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a20: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2a30: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
2a40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2a50: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a70: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2a80: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
2a90: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2aa0: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e   Disable mutexin
2ab0: 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  g of database co
2ac0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
2ad0: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74     /* Enable mut
2ae0: 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61  exing of core da
2af0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
2b00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2b10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2b20: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2b30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b40: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2b50: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2b60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2b70: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2b80: 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ERIALIZED: {.   
2b90: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c     /* Enable all
2ba0: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
2bb0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2bc0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2bd0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2be0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2bf0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
2c00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2c10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2c20: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58  ITE_CONFIG_MUTEX
2c30: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
2c40: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
2c50: 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ive mutex implem
2c60: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2c70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2c80: 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76  onfig.mutex = *v
2c90: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2ca0: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a  3_mutex_methods*
2cb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2cc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2cd0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
2ce0: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
2cf0: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
2d00: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
2d10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
2d20: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
2d30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
2d40: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
2d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2d60: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
2d70: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
2d80: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
2d90: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
2da0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
2db0: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
2dc0: 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  ve malloc implem
2dd0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2de0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2df0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72  onfig.m = *va_ar
2e00: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
2e10: 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  m_methods*);.   
2e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2e30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2e40: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
2e50: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
2e60: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
2e70: 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65  t malloc() imple
2e80: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
2e90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
2eb0: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
2ec0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
2ed0: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
2ee0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
2ef0: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
2f00: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2f10: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
2f20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2f30: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
2f40: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
2f50: 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  /* Enable or dis
2f60: 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  able the malloc 
2f70: 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f  status collectio
2f80: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
2f90: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2fa0: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
2fb0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2fc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2fd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2fe0: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a  NFIG_SCRATCH: {.
2ff0: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
3000: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
3010: 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73  scratch memory s
3020: 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  pace */.      sq
3030: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3040: 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.pScratch = va_
3050: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3070: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
3080: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
3090: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
30a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
30b0: 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .nScratch = va_a
30c0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
30d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30f0: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
3100: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
3110: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
3120: 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d  for page cache m
3130: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
3140: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3150: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d  alConfig.pPage =
3160: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3170: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3180: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
3190: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
31a0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
31b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
31c0: 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67  g.nPage = va_arg
31d0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
31e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
31f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3200: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
3210: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3220: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3230: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3240: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3250: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3260: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3270: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3280: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
32a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
32b0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
32c0: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
32d0: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
32e0: 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c   page cache impl
32f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3300: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3310: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20  lConfig.pcache2 
3320: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
3330: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3340: 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62  hods2*);.      b
3350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3360: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3370: 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b  IG_GETPCACHE2: {
3380: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
33a0: 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20  cache2.xInit==0 
33b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
33c0: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
33d0: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
33e0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
33f0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3400: 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69  ethods2*) = sqli
3410: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3420: 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62  pcache2;.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
3440: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3450: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
3460: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3470: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3480: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
3490: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
34a0: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
34b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
34c0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
34d0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
34e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
34f0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
3500: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3510: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3520: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
3530: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3540: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3550: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3560: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3570: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3590: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
35a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
35b0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
35c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
35d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
35e0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
35f0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
3600: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
3610: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
3620: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
3630: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3640: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
3650: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
3660: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3670: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
3680: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
3690: 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72  the heap pointer
36a0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
36b0: 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f  estore the mallo
36c0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
36d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
36e0: 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72   to NULL pointer
36f0: 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c  s too.  This wil
3700: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c  l cause the mall
3710: 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20  oc to go.       
3720: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
3730: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
3740: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
3750: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
3760: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   is.        ** r
3770: 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  un..        */. 
3780: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
3790: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
37a0: 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ig.m, 0, sizeof(
37b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37c0: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
37d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
37e0: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
37f0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
3800: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
3810: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
3820: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
3830: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
3840: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
3850: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
3860: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
3870: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
3880: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
3890: 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
38a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
38b0: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
38c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
38d0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
38e0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
38f0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3900: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
3910: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
3920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3930: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
3940: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
3950: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
3960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3970: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3980: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
3990: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
39a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39b0: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
39c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
39d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
39e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
39f0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3a00: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3a20: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
3a30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3a40: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69  e logger funccti
3a50: 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74  on and its first
3a60: 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a   argument..    *
3a70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73  * The default is
3a80: 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20   NULL.  Logging 
3a90: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
3aa0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
3ab0: 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  ter is.    ** NU
3ac0: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
3ad0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3ae0: 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f  G_LOG: {.      /
3af0: 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
3b00: 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
3b10: 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
3b20: 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
3b30: 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
3b40: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
3b50: 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
3b60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3b70: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3b80: 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  (ap, void(*)(voi
3b90: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
3ba0: 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  r*));.      */. 
3bb0: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
3bc0: 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  d(*LOGFUNC_t)(vo
3bd0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3be0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
3bf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c00: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
3c10: 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20  , LOGFUNC_t);.  
3c20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3c30: 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20  lConfig.pLogArg 
3c40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3c50: 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d*);.      break
3c60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3c70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3c80: 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  URI: {.      sql
3c90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3ca0: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
3cb0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3cd0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
3ce0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3cf0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3d10: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3d20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3d30: 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c  .** Set up the l
3d40: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73  ookaside buffers
3d50: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
3d60: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52  connection..** R
3d70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3d80: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a  on success.  .**
3d90: 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73   If lookaside is
3da0: 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
3db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
3dc0: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  USY..**.** The s
3dd0: 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  z parameter is t
3de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3df0: 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61  es in each looka
3e00: 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68  side slot..** Th
3e10: 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20  e cnt parameter 
3e20: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3e30: 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61   slots.  If pSta
3e40: 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a  rt is NULL the.*
3e50: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
3e60: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3e70: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3e80: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3e90: 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74  ()..** If pStart
3ea0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3eb0: 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62  n it is sz*cnt b
3ec0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ytes of memory t
3ed0: 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65  o use for.** the
3ee0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
3ef0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3f00: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
3f10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3f20: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c  d *pBuf, int sz,
3f30: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69   int cnt){.  voi
3f40: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
3f50: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3f60: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
3f70: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
3f80: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
3f90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
3fa0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
3fb0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
3fc0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
3fd0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
3fe0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
3ff0: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
4000: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
4010: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
4020: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
4030: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
4040: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4050: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
4060: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
4070: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
4080: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
4090: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
40a0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
40b0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
40c0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
40d0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
40e0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
40f0: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
4100: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
4110: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
4120: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
4130: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
4140: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
4150: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
4160: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
4170: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
4180: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
4190: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
41a0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
41b0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
41c0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
41d0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
41e0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
41f0: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
4200: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
4210: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4220: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
4230: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
4240: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
4250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4260: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
4270: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
4280: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
4290: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
42a0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
42b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
42c0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
42d0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
42e0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
42f0: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
4300: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
4310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
4320: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
4330: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4340: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
4350: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
4360: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
4370: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
4380: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
4390: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
43a0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
43b0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
43c0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
43d0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
43e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
43f0: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
4400: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
4410: 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62  bled = 1;.    db
4420: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
4430: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
4440: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
4450: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4460: 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64  .pEnd = 0;.    d
4470: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
4480: 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64  abled = 0;.    d
4490: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
44a0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
44b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
44c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
44d0: 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73  urn the mutex as
44e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
44f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4500: 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ion..*/.sqlite3_
4510: 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64  mutex *sqlite3_d
4520: 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20  b_mutex(sqlite3 
4530: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
4540: 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a  b->mutex;.}../*.
4550: 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d 75  ** Free up as mu
4560: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20  ch memory as we 
4570: 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76  can from the giv
4580: 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  en database.** c
4590: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  onnection..*/.in
45a0: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c  t sqlite3_db_rel
45b0: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69  ease_memory(sqli
45c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
45d0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  i;.  sqlite3_mut
45e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
45f0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
4600: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
4610: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
4620: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4630: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
4640: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
4650: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
4660: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
4670: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
4680: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
4690: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
46a0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
46b0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
46c0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
46d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
46e0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
46f0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
4700: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4710: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
4720: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
4730: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
4740: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
4750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
4760: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
4770: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
4780: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
4790: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
47a0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
47b0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
47c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
47d0: 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
47e0: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
47f0: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
4800: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
4810: 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34  P: R-26835-10964
4820: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
4830: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4840: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
4850: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
4860: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
4870: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4880: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
4890: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
48a0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
48b0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
48c0: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
48d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
48e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
48f0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
4900: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
4910: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
4920: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
4930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
4940: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b  mask;    /* Mask
4950: 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73   of the bit in s
4960: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20  qlite3.flags to 
4970: 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20  set/clear */.   
4980: 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d     } aFlagOp[] =
4990: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c   {.        { SQL
49a0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
49b0: 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c  BLE_FKEY,    SQL
49c0: 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20  ITE_ForeignKeys 
49d0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
49e0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
49f0: 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20  ENABLE_TRIGGER, 
4a00: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
4a10: 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d  gger  },.      }
4a20: 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ;.      unsigned
4a30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63   int i;.      rc
4a40: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
4a50: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30   /* IMP: R-42790
4a60: 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20  -23372 */.      
4a70: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4a80: 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69  Size(aFlagOp); i
4a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
4aa0: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d   aFlagOp[i].op==
4ab0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
4ac0: 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61  int onoff = va_a
4ad0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4ae0: 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73         int *pRes
4af0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4b00: 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t*);.          i
4b10: 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62  nt oldFlags = db
4b20: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  ->flags;.       
4b30: 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29     if( onoff>0 )
4b40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
4b50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67  ->flags |= aFlag
4b60: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
4b70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4b80: 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  onoff==0 ){.    
4b90: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
4ba0: 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d  s &= ~aFlagOp[i]
4bb0: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
4bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4bd0: 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66   oldFlags!=db->f
4be0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
4bf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
4c00: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
4c10: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
4c20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
4c30: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20  f( pRes ){.     
4c40: 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28         *pRes = (
4c50: 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61  db->flags & aFla
4c60: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b  gOp[i].mask)!=0;
4c70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4c80: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
4c90: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
4ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4cb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4cd0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
4ce0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
4cf0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
4d00: 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  e if the buffer 
4d10: 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69  z[0..n-1] contai
4d20: 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a  ns all spaces..*
4d30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
4d40: 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61  Spaces(const cha
4d50: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
4d60: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
4d70: 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d  n-1]==' ' ){ n--
4d80: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d  ; }.  return n==
4d90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
4da0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
4db0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
4dc0: 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59  on named "BINARY
4dd0: 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79  " which is alway
4de0: 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a  s.** available..
4df0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64  **.** If the pad
4e00: 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
4e10: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73   not NULL then s
4e20: 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20  pace padding at 
4e30: 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74  the end.** of st
4e40: 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64  rings is ignored
4e50: 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e  .  This implemen
4e60: 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c  ts the RTRIM col
4e70: 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lation..*/.stati
4e80: 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e  c int binCollFun
4e90: 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c  c(.  void *padFl
4ea0: 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ag,.  int nKey1,
4eb0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
4ec0: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
4ed0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
4ee0: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  y2.){.  int rc, 
4ef0: 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e  n;.  n = nKey1<n
4f00: 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e  Key2 ? nKey1 : n
4f10: 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d  Key2;.  rc = mem
4f20: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
4f30: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
4f40: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
4f50: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
4f60: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
4f70: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
4f80: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
4f90: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
4fa0: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
4fb0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c     ){.      /* L
4fc0: 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65  eave rc unchange
4fd0: 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65  d at 0 */.    }e
4fe0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
4ff0: 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
5000: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5010: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
5020: 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20  nother built-in 
5030: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
5040: 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a  ce: NOCASE. .**.
5050: 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e  ** This collatin
5060: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e  g sequence is in
5070: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
5080: 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65  d for "case inde
5090: 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61  pendant.** compa
50a0: 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73  rison". SQLite's
50b0: 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70   knowledge of up
50c0: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61  per and lower ca
50d0: 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a  se equivalents.*
50e0: 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74  * extends only t
50f0: 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74  o the 26 charact
5100: 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  ers used in the 
5110: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
5120: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d  ..**.** At the m
5130: 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f  oment there is o
5140: 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c  nly a UTF-8 impl
5150: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
5160: 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65  tatic int nocase
5170: 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20  CollatingFunc(. 
5180: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
5190: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
51a0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
51b0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
51c0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
51d0: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69  {.  int r = sqli
51e0: 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20  te3StrNICmp(.   
51f0: 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a     (const char *
5200: 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63  )pKey1, (const c
5210: 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b  har *)pKey2, (nK
5220: 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31  ey1<nKey2)?nKey1
5230: 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45  :nKey2);.  UNUSE
5240: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
5250: 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72  sed);.  if( 0==r
5260: 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79   ){.    r = nKey
5270: 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  1-nKey2;.  }.  r
5280: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
5290: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
52a0: 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ID of the most r
52b0: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
52c0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c  sqlite_int64 sql
52d0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
52e0: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
52f0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
5300: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a  ->lastRowid;.}..
5310: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5320: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
5330: 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72  es in the most r
5340: 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
5350: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f  lite3_exec()..*/
5360: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61  .int sqlite3_cha
5370: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
5380: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5390: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
53a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
53b0: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
53c0: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
53d0: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
53e0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
53f0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
5400: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5410: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f    return db->nTo
5420: 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  talChange;.}../*
5430: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70  .** Close all op
5440: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54  en savepoints. T
5450: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
5460: 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69  y manipulates fi
5470: 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64  elds of the.** d
5480: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
5490: 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e  bject, it does n
54a0: 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76  ot close any sav
54b0: 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79  epoints that may
54c0: 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74   be open.** at t
54d0: 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20  he b-tree/pager 
54e0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  level..*/.void s
54f0: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
5500: 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  oints(sqlite3 *d
5510: 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d  b){.  while( db-
5520: 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >pSavepoint ){. 
5530: 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54     Savepoint *pT
5540: 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  mp = db->pSavepo
5550: 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61  int;.    db->pSa
5560: 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
5570: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
5580: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
5590: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53  p);.  }.  db->nS
55a0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
55b0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
55c0: 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e   0;.  db->isTran
55d0: 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
55e0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
55f0: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
5600: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73  ctor function as
5610: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75  sociated with Fu
5620: 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e  ncDef p, if any.
5630: 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74   Except,.** if t
5640: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  his is not the l
5650: 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ast copy of the 
5660: 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74  function, do not
5670: 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74   invoke it. Mult
5680: 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f  iple.** copies o
5690: 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74  f a single funct
56a0: 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20  ion are created 
56b0: 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63  when create_func
56c0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
56d0: 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f  .** with SQLITE_
56e0: 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ANY as the encod
56f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5700: 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  oid functionDest
5710: 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  roy(sqlite3 *db,
5720: 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20   FuncDef *p){.  
5730: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
5740: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d  pDestructor = p-
5750: 3e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  >pDestructor;.  
5760: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
5770: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
5780: 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  or->nRef--;.    
5790: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d  if( pDestructor-
57a0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
57b0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78    pDestructor->x
57c0: 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63  Destroy(pDestruc
57d0: 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b  tor->pUserData);
57e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
57f0: 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75  Free(db, pDestru
5800: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ctor);.    }.  }
5810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
5820: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
5830: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69  te database.*/.i
5840: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
5850: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5860: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20   HashElem *i;   
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69   /* Hash table i
5890: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
58a0: 20 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29   j;..  if( !db )
58b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
58c0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
58d0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
58e0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
58f0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
5900: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
5910: 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
5920: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
5930: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
5940: 46 6f 72 63 65 20 78 44 65 73 74 72 6f 79 20 63  Force xDestroy c
5950: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
5960: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
5970: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
5980: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d  rnalSchema(db, -
5990: 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  1);..  /* If a t
59a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
59b0: 65 6e 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74  en, the ResetInt
59c0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61  ernalSchema() ca
59d0: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
59e0: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
59f0: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
5a00: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
5a10: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
5a20: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
5a30: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
5a40: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
5a50: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
5a60: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
5a70: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
5a80: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
5a90: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
5aa0: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
5ab0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
5ac0: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
5ad0: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
5ae0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
5af0: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
5b00: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
5b10: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
5b20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
5b30: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
5b40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
5b50: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
5b60: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c   VMs, return SQL
5b70: 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69  ITE_BUSY. */.  i
5b80: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
5b90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5ba0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
5bb0: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
5bc0: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
5bd0: 74 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73  to unfinalised s
5be0: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
5bf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5c00: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
5c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5c20: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61  TE_BUSY;.  }.  a
5c30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 61  ssert( sqlite3Sa
5c40: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
5c50: 6b 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28  k(db) );..  for(
5c60: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
5c70: 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  j++){.    Btree 
5c80: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  *pBt = db->aDb[j
5c90: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
5ca0: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
5cb0: 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74  eeIsInBackup(pBt
5cc0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
5cd0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
5ce0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
5cf0: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63      "unable to c
5d00: 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69  lose due to unfi
5d10: 6e 69 73 68 65 64 20 62 61 63 6b 75 70 20 6f 70  nished backup op
5d20: 65 72 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20  eration");.     
5d30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5d40: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
5d50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
5d60: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
5d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
5d80: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
5d90: 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
5da0: 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ures. */.  sqlit
5db0: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5dc0: 73 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d  s(db);..  for(j=
5dd0: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
5de0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
5df0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
5e00: 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[j];.    if( pD
5e10: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
5e20: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
5e30: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pDb->pBt);.   
5e40: 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b     pDb->pBt = 0;
5e50: 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20  .      if( j!=1 
5e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
5e70: 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  pSchema = 0;.   
5e80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5e90: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
5ea0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
5eb0: 2d 31 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20  -1);..  /* Tell 
5ec0: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
5ed0: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
5ee0: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
5ef0: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
5f00: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
5f10: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
5f20: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
5f30: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
5f40: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
5f50: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
5f60: 28 64 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  (db);..  assert(
5f70: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20   db->nDb<=2 );. 
5f80: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
5f90: 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  ==db->aDbStatic 
5fa0: 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
5fb0: 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46  ArraySize(db->aF
5fc0: 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20  unc.a); j++){.  
5fd0: 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74    FuncDef *pNext
5fe0: 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20  , *pHash, *p;.  
5ff0: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e    for(p=db->aFun
6000: 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61  c.a[j]; p; p=pHa
6010: 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68  sh){.      pHash
6020: 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20   = p->pHash;.   
6030: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
6040: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44         functionD
6050: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20  estroy(db, p);. 
6060: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
6070: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
6080: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6090: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
60a0: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
60b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
60c0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
60d0: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
60e0: 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  q); i; i=sqliteH
60f0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
6100: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
6110: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
6120: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
6130: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e      /* Invoke an
6140: 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65  y destructors re
6150: 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c  gistered for col
6160: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
6170: 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20  user data. */.  
6180: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
6190: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
61a0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b  pColl[j].xDel ){
61b0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a  .        pColl[j
61c0: 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e  ].xDel(pColl[j].
61d0: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pUser);.      }.
61e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
61f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
6200: 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
6210: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
6220: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
6230: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6240: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
6250: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
6260: 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  rst(&db->aModule
6270: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
6280: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
6290: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
62a0: 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48  Module *)sqliteH
62b0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
62c0: 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72  if( pMod->xDestr
62d0: 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64  oy ){.      pMod
62e0: 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d  ->xDestroy(pMod-
62f0: 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >pAux);.    }.  
6300: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6310: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20  db, pMod);.  }. 
6320: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
6330: 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  r(&db->aModule);
6340: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
6350: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
6360: 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65  TE_OK, 0); /* De
6370: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61  allocates any ca
6380: 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e  ched error strin
6390: 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  gs. */.  if( db-
63a0: 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >pErr ){.    sql
63b0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
63c0: 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  ->pErr);.  }.  s
63d0: 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e  qlite3CloseExten
63e0: 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62  sions(db);..  db
63f0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
6400: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
6410: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
6420: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
6430: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
6440: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
6450: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
6460: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
6470: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
6480: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
6490: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
64a0: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
64b0: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
64c0: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
64d0: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
64e0: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
64f0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
6500: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
6510: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
6520: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
6530: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
6540: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
6550: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6560: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
6570: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
6580: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6590: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
65a0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
65b0: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
65c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
65d0: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
65e0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
65f0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
6600: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
6610: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
6620: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
6630: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6640: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
6650: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
6660: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6670: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6680: 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 72 65 74  _free(db);.  ret
6690: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
66a0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
66b0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
66c0: 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64  les.  If tripCod
66d0: 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
66e0: 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20  OK, then.** any 
66f0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 61 72 65  open cursors are
6700: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74   invalidated ("t
6710: 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20  ripped" - as in 
6720: 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63  "tripping a circ
6730: 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29  uit.** breaker")
6740: 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74   and made to ret
6750: 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20  urn tripCode if 
6760: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75  there are any fu
6770: 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74  rther.** attempt
6780: 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75  s to use that cu
6790: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
67a0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
67b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
67c0: 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
67d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72  nt i;.  int inTr
67e0: 61 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ans = 0;.  asser
67f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6800: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
6810: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
6820: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
6830: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
6840: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6850: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
6860: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
6870: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
6880: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
6890: 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a  IsInTrans(p) ){.
68a0: 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20          inTrans 
68b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
68c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
68d0: 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43  ollback(p, tripC
68e0: 6f 64 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  ode);.      db->
68f0: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d  aDb[i].inTrans =
6900: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
6910: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
6920: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
6930: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
6940: 63 28 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  c();..  if( db->
6950: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74  flags&SQLITE_Int
6960: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
6970: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
6980: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
6990: 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  s(db);.    sqlit
69a0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
69b0: 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20  chema(db, -1);. 
69c0: 20 7d 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66   }..  /* Any def
69d0: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
69e0: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65   violations have
69f0: 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76   now been resolv
6a00: 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65  ed. */.  db->nDe
6a10: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
6a20: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
6a30: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
6a40: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
6a50: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
6a60: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
6a70: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
6a80: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
6a90: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
6aa0: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
6ab0: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
6ac0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
6ad0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6ae0: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
6af0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
6b00: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
6b10: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
6b20: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
6b30: 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ment..*/.const c
6b40: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53  har *sqlite3ErrS
6b50: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74  tr(int rc){.  st
6b60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a  atic const char*
6b70: 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20   const aMsg[] = 
6b80: 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  {.    /* SQLITE_
6b90: 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22  OK          */ "
6ba0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20  not an error",. 
6bb0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52     /* SQLITE_ERR
6bc0: 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c  OR       */ "SQL
6bd0: 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20   logic error or 
6be0: 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65  missing database
6bf0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6c00: 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20  _INTERNAL    */ 
6c10: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
6c20: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20  _PERM        */ 
6c30: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
6c40: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
6c50: 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  /* SQLITE_ABORT 
6c60: 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61        */ "callba
6c70: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
6c80: 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f  ry abort",.    /
6c90: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20  * SQLITE_BUSY   
6ca0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
6cb0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
6cc0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b    /* SQLITE_LOCK
6cd0: 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  ED      */ "data
6ce0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
6cf0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
6d00: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20  LITE_NOMEM      
6d10: 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f   */ "out of memo
6d20: 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ry",.    /* SQLI
6d30: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a  TE_READONLY    *
6d40: 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  / "attempt to wr
6d50: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
6d60: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
6d70: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
6d80: 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70  T   */ "interrup
6d90: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
6da0: 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20  ITE_IOERR       
6db0: 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72  */ "disk I/O err
6dc0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
6dd0: 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a  TE_CORRUPT     *
6de0: 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  / "database disk
6df0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
6e00: 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  med",.    /* SQL
6e10: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20  ITE_NOTFOUND    
6e20: 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72  */ "unknown oper
6e30: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53  ation",.    /* S
6e40: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
6e50: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
6e60: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
6e70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
6e80: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
6e90: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
6ea0: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
6eb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
6ec0: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
6ed0: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
6ee0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
6ef0: 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62  TY       */ "tab
6f00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
6f10: 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ata",.    /* SQL
6f20: 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20  ITE_SCHEMA      
6f30: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68  */ "database sch
6f40: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
6f50: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6f60: 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22  TOOBIG      */ "
6f70: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
6f80: 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20  oo big",.    /* 
6f90: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
6fa0: 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e  T  */ "constrain
6fb0: 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f  t failed",.    /
6fc0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  * SQLITE_MISMATC
6fd0: 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70  H    */ "datatyp
6fe0: 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20  e mismatch",.   
6ff0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   /* SQLITE_MISUS
7000: 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61  E      */ "libra
7010: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
7020: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
7030: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
7040: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
7050: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
7060: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
7070: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7080: 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20  _AUTH        */ 
7090: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
70a0: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
70b0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20  QLITE_FORMAT    
70c0: 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20    */ "auxiliary 
70d0: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
70e0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
70f0: 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20  QLITE_RANGE     
7100: 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f    */ "bind or co
7110: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
7120: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
7130: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
7140: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
7150: 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20  encrypted or is 
7160: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
7170: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
7180: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
7190: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
71a0: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
71b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
71c0: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
71d0: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
71e0: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
71f0: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
7200: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
7210: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26  lt: {.      rc &
7220: 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66  = 0xff;.      if
7230: 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20  ( ALWAYS(rc>=0) 
7240: 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28  && rc<ArraySize(
7250: 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63  aMsg) && aMsg[rc
7260: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
7270: 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b  zErr = aMsg[rc];
7280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
72a0: 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d    return zErr;.}
72b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
72c0: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
72d0: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
72e0: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
72f0: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
7300: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
7310: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
7320: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
7330: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
7340: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
7350: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
7360: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
7370: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
7380: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
7390: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
73a0: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
73b0: 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
73c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
73d0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e  onnection */. in
73e0: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
73f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7400: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
7410: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
7420: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
7430: 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65  S_WIN || (define
7440: 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
7450: 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20  & HAVE_USLEEP). 
7460: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
7470: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
7480: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
7490: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
74a0: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
74b0: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
74c0: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
74d0: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
74e0: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
74f0: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
7500: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
7510: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72  efine NDELAY Arr
7520: 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20  aySize(delays). 
7530: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
7540: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
7550: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
7560: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
7570: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
7580: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
7590: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
75a0: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
75b0: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
75c0: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
75d0: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
75e0: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
75f0: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
7600: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
7610: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
7620: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
7630: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
7640: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
7650: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
7660: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
7670: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
7680: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
7690: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
76a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
76b0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
76c0: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
76d0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
76e0: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
76f0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
7700: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
7710: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
7720: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
7730: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
7740: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
7750: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
7760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
7770: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
7780: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
7790: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
77a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
77b0: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
77c0: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
77d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
77e0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
77f0: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
7800: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
7810: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
7820: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
7830: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
7840: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
7850: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
7860: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
7870: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
7880: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
7890: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
78a0: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
78b0: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
78c0: 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45  t rc;.  if( NEVE
78d0: 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46  R(p==0) || p->xF
78e0: 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  unc==0 || p->nBu
78f0: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
7900: 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63  .  rc = p->xFunc
7910: 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75  (p->pArg, p->nBu
7920: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  sy);.  if( rc==0
7930: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
7940: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
7950: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
7960: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7970: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
7980: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
7990: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
79a0: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
79b0: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
79c0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
79d0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
79e0: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
79f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7a00: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
7a10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
7a20: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
7a30: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
7a40: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
7a50: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
7a60: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
7a70: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
7a80: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
7a90: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
7aa0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
7ab0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
7ac0: 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  y = 0;.  sqlite3
7ad0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7ae0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
7af0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7b00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7b10: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
7b20: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
7b30: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
7b40: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
7b50: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
7b60: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
7b70: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
7b80: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
7b90: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
7ba0: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
7bb0: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
7bc0: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
7bd0: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
7be0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7bf0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
7c00: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
7c10: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
7c20: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
7c30: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
7c40: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
7c50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7c60: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7c70: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
7c80: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
7c90: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
7ca0: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
7cb0: 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64  ps = nOps;.    d
7cc0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
7cd0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
7ce0: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
7cf0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
7d00: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
7d10: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
7d20: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
7d30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7d40: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7d50: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
7d60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7d70: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
7d80: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
7d90: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
7da0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
7db0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
7dc0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
7dd0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
7de0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
7df0: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
7e00: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69  db, int ms){.  i
7e10: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64  f( ms>0 ){.    d
7e20: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
7e30: 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ms;.    sqlite3
7e40: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
7e50: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
7e60: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
7e70: 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65  id*)db);.  }else
7e80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
7e90: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
7ea0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
7eb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7ec0: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
7ed0: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
7ee0: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
7ef0: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
7f00: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
7f10: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
7f20: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
7f30: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
7f40: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
7f50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7f60: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
7f70: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
7f80: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7f90: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
7fa0: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
7fb0: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
7fc0: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
7fd0: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
7fe0: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
7ff0: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
8000: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
8010: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
8020: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
8030: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
8040: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
8050: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
8060: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
8070: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
8080: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
8090: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
80a0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
80b0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
80c0: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
80d0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
80e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
80f0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
8100: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
8110: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
8120: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
8130: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
8140: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
8150: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8160: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
8170: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
8180: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
8190: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
81a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
81b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
81c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
81d0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
81e0: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
81f0: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
8200: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
8210: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
8220: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
8230: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
8240: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
8250: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
8260: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
8270: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
8280: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
8290: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
82a0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
82b0: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
82c0: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
82d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
82e0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23  E_BKPT;.  }.  .#
82f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8300: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
8310: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
8320: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
8330: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
8340: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
8350: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
8360: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
8370: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
8380: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
8390: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
83a0: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
83b0: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
83c0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
83d0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
83e0: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
83f0: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
8400: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
8410: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
8420: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
8430: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
8440: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
8450: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
8460: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
8470: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
8480: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
8490: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
84a0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
84b0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
84c0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
84d0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
84e0: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
84f0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
8500: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
8510: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8520: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8530: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
8540: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
8550: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
8560: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a  SQLITE_UTF16LE,.
8570: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
8580: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
8590: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
85a0: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
85b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
85c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
85d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
85e0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
85f0: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
8600: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
8610: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
8620: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
8630: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
8640: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
8650: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
8660: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
8670: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
8680: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
8690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
86a0: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
86b0: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
86c0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
86d0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
86e0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
86f0: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
8700: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
8710: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
8720: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
8730: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
8740: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
8750: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
8760: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
8770: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
8780: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
8790: 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45  ( p && p->iPrefE
87a0: 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  nc==enc && p->nA
87b0: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
87c0: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
87d0: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
87e0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
87f0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
8800: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
8810: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
8820: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
8830: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
8840: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
8850: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
8860: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8870: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8880: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
8890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
88a0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
88b0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
88c0: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
88d0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
88e0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
88f0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
8900: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
8910: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
8920: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
8930: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
8940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8950: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
8960: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
8970: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
8980: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
8990: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
89a0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
89b0: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
89c0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
89d0: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
89e0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
89f0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
8a00: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
8a10: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
8a20: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
8a30: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
8a40: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
8a50: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e  flags = 0;.  p->
8a60: 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20  xFunc = xFunc;. 
8a70: 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65   p->xStep = xSte
8a80: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
8a90: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
8aa0: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
8ab0: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
8ac0: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
8ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8ae0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
8af0: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
8b00: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
8b10: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8b20: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
8b30: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
8b40: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
8b50: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
8b60: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
8b70: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
8b80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
8b90: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
8ba0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
8bb0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
8bc0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
8bd0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
8be0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
8bf0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
8c00: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
8c10: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8c20: 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63  ion_v2(db, zFunc
8c30: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
8c40: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  xFunc, xStep,.  
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a    xFinal, 0);.}.
8c80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
8c90: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
8ca0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8cb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8cc0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
8cd0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
8ce0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
8cf0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
8d00: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8d10: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
8d20: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
8d30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
8d40: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
8d50: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
8d60: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
8d70: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
8d80: 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f  d (*xDestroy)(vo
8d90: 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  id *).){.  int r
8da0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
8db0: 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ;.  FuncDestruct
8dc0: 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20  or *pArg = 0;.  
8dd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8de0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8df0: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
8e00: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
8e10: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
8e20: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8e30: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
8e40: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
8e50: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
8e60: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
8e70: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
8e80: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
8e90: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
8ea0: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
8eb0: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
8ec0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
8ed0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
8ee0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
8ef0: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
8f00: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41  Step, xFinal, pA
8f10: 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20  rg);.  if( pArg 
8f20: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
8f30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8f40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
8f50: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
8f60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
8f70: 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ree(db, pArg);. 
8f80: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
8f90: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
8fa0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
8fb0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8fc0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
8fd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
8fe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
8ff0: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
9000: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
9010: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
9020: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
9030: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
9040: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
9050: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
9060: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
9070: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
9080: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
9090: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
90a0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
90b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
90c0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
90d0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
90e0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
90f0: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
9100: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
9110: 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  nc8;.  sqlite3_m
9120: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9130: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
9140: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
9150: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
9160: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
9170: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
9180: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
9190: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
91a0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
91b0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
91c0: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
91d0: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
91e0: 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20  p, xFinal,0);.  
91f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9200: 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
9210: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
9220: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
9230: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9240: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
9250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
9260: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  f.../*.** Declar
9270: 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f  e that a functio
9280: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c  n has been overl
9290: 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75  oaded by a virtu
92a0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
92b0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
92c0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
92d0: 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62  s a regular glob
92e0: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  al function, the
92f0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
9300: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
9310: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
9320: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
9330: 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20  hen create.** a 
9340: 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77  new one that alw
9350: 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e  ays throws a run
9360: 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a  -time error.  .*
9370: 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61  *.** When virtua
9380: 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20  l tables intend 
9390: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76  to provide an ov
93a0: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
93b0: 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  n, they.** shoul
93c0: 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  d call this rout
93d0: 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ine to make sure
93e0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
93f0: 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20  tion exists..** 
9400: 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  A global functio
9410: 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20  n must exist in 
9420: 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72  order for name r
9430: 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72  esolution to wor
9440: 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  k.** properly..*
9450: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76  /.int sqlite3_ov
9460: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
9470: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
9480: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
9490: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a  ame,.  int nArg.
94a0: 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  ){.  int nName =
94b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
94c0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72  (zName);.  int r
94d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
94e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
94f0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
9500: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
9510: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
9520: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
9530: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
9540: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  0)==0 ){.    rc 
9550: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
9560: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
9570: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
9580: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
95a0: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
95b0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  nction, 0, 0, 0)
95c0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
95d0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
95e0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
95f0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9600: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9610: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
9620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9630: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
9640: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
9650: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
9660: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
9670: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
9680: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
9690: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
96a0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
96b0: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
96c0: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
96d0: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
96e0: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
96f0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
9700: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
9710: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
9720: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
9730: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
9740: 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28   *sqlite3_trace(
9750: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
9760: 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64  d (*xTrace)(void
9770: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20  *,const char*), 
9780: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76  void *pArg){.  v
9790: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
97a0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
97b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
97c0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65  Old = db->pTrace
97d0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  Arg;.  db->xTrac
97e0: 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62  e = xTrace;.  db
97f0: 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
9800: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
9810: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9820: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
9830: 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67  Old;.}./*.** Reg
9840: 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
9850: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
9860: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
9870: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
9880: 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
9890: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
98a0: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
98b0: 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
98c0: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
98d0: 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
98e0: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
98f0: 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
9900: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
9910: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
9920: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
9930: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
9940: 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
9950: 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
9960: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
9970: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
9980: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
9990: 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
99a0: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
99b0: 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
99c0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
99d0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
99e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
99f0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
9a00: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
9a10: 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62  ProfileArg;.  db
9a20: 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72  ->xProfile = xPr
9a30: 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72  ofile;.  db->pPr
9a40: 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b  ofileArg = pArg;
9a50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9a60: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9a70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
9a80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9a90: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
9aa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
9ab0: 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f  er a function to
9ac0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e   be invoked when
9ad0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
9ae0: 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68  ommits..** If th
9af0: 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69  e invoked functi
9b00: 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
9b10: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ero, then the co
9b20: 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a  mmit becomes a.*
9b30: 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76  * rollback..*/.v
9b40: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d  oid *sqlite3_com
9b50: 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  mit_hook(.  sqli
9b60: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
9b70: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
9b80: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
9b90: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
9ba0: 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  nt (*xCallback)(
9bb0: 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63  void*),  /* Func
9bc0: 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f  tion to invoke o
9bd0: 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f  n each commit */
9be0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c00: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
9c10: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
9c20: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
9c30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9c40: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9c50: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
9c60: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
9c70: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
9c80: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
9c90: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
9ca0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
9cb0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9cc0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
9cd0: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
9ce0: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
9cf0: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
9d00: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
9d10: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
9d20: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
9d30: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
9d40: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9d50: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
9d60: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
9d70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d90: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9da0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
9db0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
9dc0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
9dd0: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
9de0: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
9df0: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
9e00: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
9e10: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
9e20: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
9e30: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
9e40: 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
9e50: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
9e60: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
9e70: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
9e80: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
9e90: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
9ea0: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
9eb0: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
9ec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9ed0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9ee0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
9ef0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
9f00: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
9f10: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
9f20: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
9f30: 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
9f40: 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
9f50: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
9f60: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9f70: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
9f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fa0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9fb0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
9fc0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
9fd0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
9fe0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
9ff0: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
a000: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
a010: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
a020: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
a030: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
a040: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
a050: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
a060: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
a070: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b  b->pRollbackArg;
a080: 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  .  db->xRollback
a090: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
a0a0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c  back;.  db->pRol
a0b0: 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b  lbackArg = pArg;
a0c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a0d0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a0e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
a0f0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
a100: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
a110: 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52  ATE_HOOK./*.** R
a120: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
a130: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
a140: 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
a150: 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
a160: 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
a170: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
a180: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a190: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
a1a0: 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68  ite3_preupdate_h
a1b0: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
a1c0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
a1d0: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
a1e0: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
a1f0: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a  base */.  void(*
a200: 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20  xCallback)(     
a210: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
a220: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
a230: 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
a240: 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63  nt,char const*,c
a250: 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74  har const*,sqlit
a260: 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33  e3_int64,sqlite3
a270: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
a280: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
a290: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61       /* First ca
a2a0: 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20  llback argument 
a2b0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
a2c0: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
a2d0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
a2e0: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
a2f0: 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
a300: 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
a310: 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  teCallback = xCa
a320: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50  llback;.  db->pP
a330: 72 65 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  reUpdateArg = pA
a340: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
a350: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
a360: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
a370: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
a380: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
a390: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
a3a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a3b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
a3c0: 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
a3d0: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
a3e0: 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71  registered by sq
a3f0: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
a400: 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49  eckpoint()..** I
a410: 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61  nvoke sqlite3_wa
a420: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  l_checkpoint if 
a430: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
a440: 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
a450: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
a460: 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e  er than sqlite3.
a470: 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20  pWalArg cast to 
a480: 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20  an integer (the 
a490: 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
a4a0: 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63   by.** wal_autoc
a4b0: 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  heckpoint())..*/
a4c0: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c   .int sqlite3Wal
a4d0: 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76  DefaultHook(.  v
a4e0: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
a4f0: 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  ,     /* Argumen
a500: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
a510: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db,           /*
a520: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   Connection */. 
a530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
a540: 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
a550: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ase */.  int nFr
a560: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
a570: 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a  /* Size of WAL *
a580: 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d  /.){.  if( nFram
a590: 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  e>=SQLITE_PTR_TO
a5a0: 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61  _INT(pClientData
a5b0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
a5c0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
a5d0: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
a5e0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
a5f0: 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71  db, zDb);.    sq
a600: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
a610: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65  lloc();.  }.  re
a620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a630: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a640: 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
a650: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
a660: 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  an sqlite3_wal_h
a670: 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74  ook() callback t
a680: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
a690: 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20  checkpoint.** a 
a6a0: 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63  database after c
a6b0: 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
a6c0: 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
a6d0: 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a   are nFrame or.*
a6e0: 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e  * more frames in
a6f0: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50   the log file. P
a700: 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61  assing zero or a
a710: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
a720: 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65  as the.** nFrame
a730: 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62   parameter disab
a740: 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68  les automatic ch
a750: 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65  eckpoints entire
a760: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ly..**.** The ca
a770: 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
a780: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
a790: 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20  on replaces any 
a7a0: 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63  existing callbac
a7b0: 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20  k.** registered 
a7c0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
a7d0: 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69  l_hook(). Likewi
a7e0: 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20  se, registering 
a7f0: 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73  a callback.** us
a800: 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
a810: 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20  hook() disables 
a820: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68  the automatic ch
a830: 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69  eckpoint mechani
a840: 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  sm.** configured
a850: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a860: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
a870: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
a880: 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
a890: 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23  , int nFrame){.#
a8a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
a8b0: 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50  T_WAL.  UNUSED_P
a8c0: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
a8d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a8e0: 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a  (nFrame);.#else.
a8f0: 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29    if( nFrame>0 )
a900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
a910: 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74  l_hook(db, sqlit
a920: 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
a930: 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
a940: 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20  PTR(nFrame));.  
a950: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
a960: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
a970: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
a980: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
a990: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
a9a0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
a9b0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
a9c0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
a9d0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74  nsaction is writ
a9e0: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ten.** into the 
a9f0: 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20  write-ahead-log 
aa00: 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
aa10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
aa20: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61  void *sqlite3_wa
aa30: 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  l_hook(.  sqlite
aa40: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
aa50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
aa60: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
aa70: 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a  this db handle *
aa80: 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61  /.  int(*xCallba
aa90: 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69  ck)(void *, sqli
aaa0: 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
aab0: 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  *, int),.  void 
aac0: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
aae0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
aaf0: 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  sed to xCallback
ab00: 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  () */.){.#ifndef
ab10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
ab20: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
ab30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ab40: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
ab50: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57  .  pRet = db->pW
ab60: 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61  alArg;.  db->xWa
ab70: 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  lCallback = xCal
ab80: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61  lback;.  db->pWa
ab90: 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  lArg = pArg;.  s
aba0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
abb0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
abc0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65   return pRet;.#e
abd0: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  lse.  return 0;.
abe0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
abf0: 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
ac00: 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20  ase zDb..*/.int 
ac10: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
ac20: 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c  kpoint_v2(.  sql
ac30: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac50: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
ac60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
ac70: 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *zDb,           
ac80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
ac90: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
aca0: 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  e (or NULL) */. 
acb0: 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20   int eMode,     
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
ace0: 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f  POINT_* value */
acf0: 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20  .  int *pnLog,  
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad10: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
ad20: 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72  of WAL log in fr
ad30: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ames */.  int *p
ad40: 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20  nCkpt           
ad50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
ad60: 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  : Total number o
ad70: 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f  f frames checkpo
ad80: 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64  inted */.){.#ifd
ad90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
ada0: 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  AL.  return SQLI
adb0: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69  TE_OK;.#else.  i
adc0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ade0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
adf0: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c  .  int iDb = SQL
ae00: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
ae10: 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44  ;  /* sqlite3.aD
ae20: 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20  b[] index of db 
ae30: 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  to checkpoint */
ae40: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
ae50: 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
ae60: 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20  iables to -1 in 
ae70: 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
ae80: 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70  curs. */.  if( p
ae90: 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20  nLog ) *pnLog = 
aea0: 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74  -1;.  if( pnCkpt
aeb0: 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b   ) *pnCkpt = -1;
aec0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
aed0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
aee0: 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  LL>SQLITE_CHECKP
aef0: 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b 0a  OINT_PASSIVE );.
af00: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
af10: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
af20: 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
af30: 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20  NT_RESTART );.  
af40: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
af50: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
af60: 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43  E+2==SQLITE_CHEC
af70: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29  KPOINT_RESTART )
af80: 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51  ;.  if( eMode<SQ
af90: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
afa0: 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65  PASSIVE || eMode
afb0: 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  >SQLITE_CHECKPOI
afc0: 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20 20  NT_RESTART ){.  
afd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
afe0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73  MISUSE;.  }..  s
aff0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b000: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
b010: 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b   if( zDb && zDb[
b020: 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  0] ){.    iDb = 
b030: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
b040: 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a  e(db, zDb);.  }.
b050: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
b060: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
b070: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
b080: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
b090: 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77  E_ERROR, "unknow
b0a0: 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c  n database: %s",
b0b0: 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   zDb);.  }else{.
b0c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b0d0: 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69  Checkpoint(db, i
b0e0: 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Db, eMode, pnLog
b0f0: 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73  , pnCkpt);.    s
b100: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
b110: 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63  rc, 0);.  }.  rc
b120: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
b130: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
b140: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
b150: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
b160: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
b170: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
b180: 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
b190: 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55  Db. If zDb is NU
b1a0: 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75  LL, or if the bu
b1b0: 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a  ffer zDb points.
b1c0: 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61  ** to contains a
b1d0: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
b1e0: 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65  ing, all attache
b1f0: 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  d databases are 
b200: 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
b210: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b220: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
b230: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
b240: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
b250: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
b260: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
b270: 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  2(db, zDb, SQLIT
b280: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
b290: 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  SIVE, 0, 0);.}..
b2a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b2b0: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75  MIT_WAL./*.** Ru
b2c0: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  n a checkpoint o
b2d0: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
b2e0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
b2f0: 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  if database iDb 
b300: 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e  is.** not curren
b310: 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20  tly open in WAL 
b320: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  mode..**.** If a
b330: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
b340: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
b350: 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b  base being check
b360: 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a  pointed, this .*
b370: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
b380: 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
b390: 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e   and a checkpoin
b3a0: 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  t is not attempt
b3b0: 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  ed. If .** an er
b3c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
b3d0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65   running the che
b3e0: 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69  ckpoint, an SQLi
b3f0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
b400: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69   .** returned (i
b410: 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .e. SQLITE_IOERR
b420: 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ). Otherwise, SQ
b430: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
b440: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
b450: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73  base handle db s
b460: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79  hould be held by
b470: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65   the caller. The
b480: 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69   mutex.** associ
b490: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ated with the sp
b4a0: 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65  ecific b-tree be
b4b0: 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
b4c0: 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20   is taken by.** 
b4d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68  this function wh
b4e0: 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
b4f0: 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  nt is running..*
b500: 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70  *.** If iDb is p
b510: 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  assed SQLITE_MAX
b520: 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20  _ATTACHED, then 
b530: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
b540: 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68  abases are.** ch
b550: 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61  eckpointed. If a
b560: 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
b570: 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74  ntered it is ret
b580: 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
b590: 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70  y -.** no attemp
b5a0: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65  t is made to che
b5b0: 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61  ckpoint any rema
b5c0: 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e  ining databases.
b5d0: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
b5e0: 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66   eMode is one of
b5f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
b600: 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
b610: 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a   or RESTART..*/.
b620: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
b630: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
b640: 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
b650: 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f  eMode, int *pnLo
b660: 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b  g, int *pnCkpt){
b670: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b680: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
b690: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
b6a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
b6d0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
b6e0: 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a  h attached dbs *
b6f0: 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20  /.  int bBusy = 
b700: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b710: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53      /* True if S
b720: 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62  QLITE_BUSY has b
b730: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  een encountered 
b740: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
b750: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b760: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
b770: 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20   assert( !pnLog 
b780: 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b  || *pnLog==-1 );
b790: 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b  .  assert( !pnCk
b7a0: 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d  pt || *pnCkpt==-
b7b0: 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  1 );..  for(i=0;
b7c0: 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63   i<db->nDb && rc
b7d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
b7e0: 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44  ){.    if( i==iD
b7f0: 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45  b || iDb==SQLITE
b800: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b  _MAX_ATTACHED ){
b810: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b820: 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69  te3BtreeCheckpoi
b830: 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  nt(db->aDb[i].pB
b840: 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  t, eMode, pnLog,
b850: 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20   pnCkpt);.      
b860: 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20  pnLog = 0;.     
b870: 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20   pnCkpt = 0;.   
b880: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b890: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
b8a0: 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20    bBusy = 1;.   
b8b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b8c0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
b8d0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
b8e0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
b8f0: 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49  && bBusy) ? SQLI
b900: 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a  TE_BUSY : rc;.}.
b910: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b920: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
b930: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b940: 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
b950: 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68  f main-memory sh
b960: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73  ould be used ins
b970: 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d  tead of.** a tem
b980: 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20  porary file for 
b990: 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20  transient pager 
b9a0: 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d  files and statem
b9b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ent journals..**
b9c0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
b9d0: 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ned depends on t
b9e0: 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  he value of db->
b9f0: 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74  temp_store (runt
ba00: 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ime.** parameter
ba10: 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  ) and the compil
ba20: 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
ba30: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
ba40: 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  E. The.** follow
ba50: 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
ba60: 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  bes the relation
ba70: 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65  ship between the
ba80: 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  se two values.**
ba90: 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
baa0: 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ons return value
bab0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
bac0: 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20  _TEMP_STORE     
bad0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
bae0: 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
baf0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
bb00: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
bb10: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
bb50: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
bb60: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
bb80: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
bb90: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
bbd0: 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
bc00: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
bc10: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20  turn 1).**   1  
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
bc40: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
bc50: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
bc60: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
bc70: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
bc80: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
bc90: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
bca0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
bcb0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
bcd0: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
bce0: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
bd10: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
bd20: 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20   1).**   3      
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
bd40: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
bd50: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
bd60: 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71  urn 1).*/.int sq
bd70: 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
bd80: 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20  y(const sqlite3 
bd90: 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *db){.#if SQLITE
bda0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20  _TEMP_STORE==1. 
bdb0: 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
bdc0: 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23  mp_store==2 );.#
bdd0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
bde0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20  _TEMP_STORE==2. 
bdf0: 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
be00: 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23  mp_store!=1 );.#
be10: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
be20: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20  _TEMP_STORE==3. 
be30: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
be40: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
be50: 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c  P_STORE<1 || SQL
be60: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33  ITE_TEMP_STORE>3
be70: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
be80: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
be90: 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  urn UTF-8 encode
bea0: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
beb0: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
bec0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
bed0: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
bee0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
bef0: 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65  e3_errmsg(sqlite
bf00: 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
bf10: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21  char *z;.  if( !
bf20: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
bf30: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
bf40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
bf50: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
bf60: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
bf70: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
bf80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
bf90: 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
bfa0: 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
bfb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
bfc0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
bfd0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
bfe0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
bff0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
c000: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
c010: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 28  }else{.    z = (
c020: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
c030: 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72  lue_text(db->pEr
c040: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
c050: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
c060: 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  d );.    if( z==
c070: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  0 ){.      z = s
c080: 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
c090: 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d  >errCode);.    }
c0a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
c0b0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
c0c0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
c0d0: 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
c0e0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
c0f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
c100: 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  -16 encoded Engl
c110: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
c120: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
c130: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
c140: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  rror..*/.const v
c150: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  oid *sqlite3_err
c160: 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64  msg16(sqlite3 *d
c170: 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
c180: 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b  st u16 outOfMem[
c190: 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27  ] = {.    'o', '
c1a0: 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f  u', 't', ' ', 'o
c1b0: 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27  ', 'f', ' ', 'm'
c1c0: 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c  , 'e', 'm', 'o',
c1d0: 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d   'r', 'y', 0.  }
c1e0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
c1f0: 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20   u16 misuse[] = 
c200: 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20  {.    'l', 'i', 
c210: 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27  'b', 'r', 'a', '
c220: 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20  r', 'y', ' ', . 
c230: 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27     'r', 'o', 'u'
c240: 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c  , 't', 'i', 'n',
c250: 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'e', ' ', .    
c260: 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27  'c', 'a', 'l', '
c270: 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20  l', 'e', 'd', ' 
c280: 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  ', .    'o', 'u'
c290: 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 't', ' ', .   
c2a0: 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
c2b0: 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27  .    's', 'e', '
c2c0: 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e  q', 'u', 'e', 'n
c2d0: 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20  ', 'c', 'e', 0. 
c2e0: 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69   };..  const voi
c2f0: 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  d *z;.  if( !db 
c300: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
c310: 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
c320: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
c330: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
c340: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
c350: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
c360: 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71  misuse;.  }.  sq
c370: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c380: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c390: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
c3a0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
c3b0: 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
c3c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
c3d0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c3e0: 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
c3f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
c400: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c410: 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
c420: 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65  pErr, -1, sqlite
c430: 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
c440: 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ode),.          
c450: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
c460: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
c470: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
c480: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
c490: 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >pErr);.    }.  
c4a0: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
c4b0: 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20  may have failed 
c4c0: 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20  within the call 
c4d0: 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  to sqlite3_value
c4e0: 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a  _text16().    **
c4f0: 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20   above. If this 
c500: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
c510: 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  n the db->malloc
c520: 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64  Failed flag need
c530: 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
c540: 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65  leared before re
c550: 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73  turning. Do this
c560: 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
c570: 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a  ad of via.    **
c580: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
c590: 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74  ), to avoid sett
c5a0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
c5b0: 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65   handle error me
c5c0: 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssage..    */.  
c5d0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
c5e0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ed = 0;.  }.  sq
c5f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
c600: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
c610: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
c620: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c630: 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
c640: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
c650: 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
c660: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
c670: 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
c680: 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
c690: 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
c6a0: 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
c6b0: 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
c6c0: 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
c6d0: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
c6e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
c6f0: 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
c700: 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
c710: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
c720: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
c730: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c740: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
c750: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
c760: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
c770: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
c780: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
c7a0: 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
c7b0: 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rMask;.}.int sql
c7c0: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
c7d0: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
c7e0: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
c7f0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
c800: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
c810: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c820: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
c830: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
c840: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
c850: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
c860: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c870: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
c880: 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  >errCode;.}../*.
c890: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
c8a0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
c8b0: 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
c8c0: 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
c8d0: 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
c8e0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
c8f0: 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
c900: 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
c910: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
c920: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
c930: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e  *zName, .  u8 en
c940: 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  c,.  void* pCtx,
c950: 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
c960: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
c970: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
c980: 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
c990: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
c9a0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
c9b0: 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a  ll;.  int enc2;.
c9c0: 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71    int nName = sq
c9d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
c9e0: 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  ame);.  .  asser
c9f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ca00: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
ca10: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c   );..  /* If SQL
ca20: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
ca30: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
ca40: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
ca50: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
ca60: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
ca70: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
ca80: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
ca90: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
caa0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
cab0: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
cac0: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
cad0: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
cae0: 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74   enc2 = enc;.  t
caf0: 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
cb00: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20  QLITE_UTF16 );. 
cb10: 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
cb20: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
cb30: 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65  IGNED );.  if( e
cb40: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
cb50: 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54  6 || enc2==SQLIT
cb60: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
cb70: 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51  ){.    enc2 = SQ
cb80: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
cb90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32  ;.  }.  if( enc2
cba0: 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  <SQLITE_UTF8 || 
cbb0: 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31  enc2>SQLITE_UTF1
cbc0: 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  6BE ){.    retur
cbd0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
cbe0: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
cbf0: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61  Check if this ca
cc00: 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f  ll is removing o
cc10: 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65  r replacing an e
cc20: 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  xisting collatio
cc30: 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65  n .  ** sequence
cc40: 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65  . If so, and the
cc50: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
cc60: 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20  s, return busy. 
cc70: 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72  If there.  ** ar
cc80: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
cc90: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
cca0: 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
ccb0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
ccc0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
ccd0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
cce0: 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
ccf0: 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  0);.  if( pColl 
cd00: 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
cd10: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63  {.    if( db->ac
cd20: 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20  tiveVdbeCnt ){. 
cd30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
cd40: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
cd50: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
cd60: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
cd70: 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  dify collation s
cd80: 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61  equence due to a
cd90: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
cda0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
cdb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
cdc0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
cdd0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
cde0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20  tements(db);..  
cdf0: 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f    /* If collatio
ce00: 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
ce10: 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72   was created dir
ce20: 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20  ectly by a call 
ce30: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
ce40: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
ce50: 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65  on, and not gene
ce60: 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f  rated by synthCo
ce70: 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20  llSeq(),.    ** 
ce80: 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20  then any copies 
ce90: 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c  made by synthCol
cea0: 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62  lSeq() need to b
ceb0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20  e invalidated.. 
cec0: 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c     ** Also, coll
ced0: 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72  ation destructor
cee0: 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28   - CollSeq.xDel(
cef0: 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ) - function may
cf00: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
cf10: 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  be called..    *
cf20: 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c  / .    if( (pCol
cf30: 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  l->enc & ~SQLITE
cf40: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d  _UTF16_ALIGNED)=
cf50: 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43  =enc2 ){.      C
cf60: 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20  ollSeq *aColl = 
cf70: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
cf80: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a  &db->aCollSeq, z
cf90: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
cfa0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
cfb0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
cfc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
cfd0: 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c  lSeq *p = &aColl
cfe0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
cff0: 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e   p->enc==pColl->
d000: 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  enc ){.         
d010: 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a   if( p->xDel ){.
d020: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78              p->x
d030: 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20  Del(p->pUser);. 
d040: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d050: 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30       p->xCmp = 0
d060: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d070: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d080: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
d090: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
d0a0: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
d0b0: 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   1);.  if( pColl
d0c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
d0d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f  ITE_NOMEM;.  pCo
d0e0: 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70  ll->xCmp = xComp
d0f0: 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55  are;.  pColl->pU
d100: 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43  ser = pCtx;.  pC
d110: 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c  oll->xDel = xDel
d120: 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d  ;.  pColl->enc =
d130: 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e   (u8)(enc2 | (en
d140: 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c & SQLITE_UTF16
d150: 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71  _ALIGNED));.  sq
d160: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
d170: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
d180: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d190: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
d1a0: 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 68   array defines h
d1b0: 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73  ard upper bounds
d1c0: 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73   on limit values
d1d0: 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61  .  The.** initia
d1e0: 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65  lizer must be ke
d1f0: 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20  pt in sync with 
d200: 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  the SQLITE_LIMIT
d210: 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69  _*.** #defines i
d220: 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a  n sqlite3.h..*/.
d230: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
d240: 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20   aHardLimit[] = 
d250: 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  {.  SQLITE_MAX_L
d260: 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
d270: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a  MAX_SQL_LENGTH,.
d280: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c    SQLITE_MAX_COL
d290: 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  UMN,.  SQLITE_MA
d2a0: 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20  X_EXPR_DEPTH,.  
d2b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
d2c0: 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51  UND_SELECT,.  SQ
d2d0: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
d2e0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  ,.  SQLITE_MAX_F
d2f0: 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53  UNCTION_ARG,.  S
d300: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
d310: 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  ED,.  SQLITE_MAX
d320: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
d330: 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
d340: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
d350: 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  ER,.  SQLITE_MAX
d360: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a  _TRIGGER_DEPTH,.
d370: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
d380: 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
d390: 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
d3a0: 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
d3b0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
d3c0: 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
d3d0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
d3e0: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
d3f0: 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
d400: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
d410: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
d420: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
d430: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
d440: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
d450: 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
d460: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
d470: 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
d480: 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
d490: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
d4a0: 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
d4b0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
d4c0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
d4d0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
d4e0: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
d4f0: 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
d500: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
d510: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
d520: 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
d530: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
d540: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
d550: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
d560: 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
d570: 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
d580: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
d590: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
d5a0: 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
d5b0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
d5c0: 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  000.# error SQLI
d5d0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
d5e0: 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77  ARG must be betw
d5f0: 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23  een 0 and 1000.#
d600: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
d610: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20  _MAX_ATTACHED<0 
d620: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  || SQLITE_MAX_AT
d630: 54 41 43 48 45 44 3e 36 32 0a 23 20 65 72 72 6f  TACHED>62.# erro
d640: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  r SQLITE_MAX_ATT
d650: 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65  ACHED must be be
d660: 74 77 65 65 6e 20 30 20 61 6e 64 20 36 32 0a 23  tween 0 and 62.#
d670: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
d680: 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
d690: 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72  N_LENGTH<1.# err
d6a0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  or SQLITE_MAX_LI
d6b0: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
d6c0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
d6d0: 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
d6e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
d6f0: 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20  N>32767.# error 
d700: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
d710: 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65  N must not excee
d720: 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23  d 32767.#endif.#
d730: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  if SQLITE_MAX_TR
d740: 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20  IGGER_DEPTH<1.# 
d750: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
d760: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d  _TRIGGER_DEPTH m
d770: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
d780: 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  1.#endif.../*.**
d790: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
d7a0: 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
d7b0: 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
d7c0: 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
d7d0: 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
d7e0: 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
d7f0: 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
d800: 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
d810: 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
d820: 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
d830: 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
d840: 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
d850: 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
d860: 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
d870: 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
d880: 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
d890: 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
d8a0: 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
d8b0: 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
d8c0: 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
d8d0: 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
d8e0: 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
d8f0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
d900: 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
d910: 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
d920: 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45  it;...  /* EVIDE
d930: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d  NCE-OF: R-30189-
d940: 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c  54097 For each l
d950: 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51  imit category SQ
d960: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a  LITE_LIMIT_NAME.
d970: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
d980: 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
d990: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
d9a0: 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70  time by a C prep
d9b0: 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61  rocessor.  ** ma
d9c0: 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54  cro called SQLIT
d9d0: 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65  E_MAX_NAME. (The
d9e0: 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68   "_LIMIT_" in th
d9f0: 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65  e name is change
da00: 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f  d to.  ** "_MAX_
da10: 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ".).  */.  asser
da20: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
da30: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
da40: 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  H]==SQLITE_MAX_L
da50: 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
da60: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
da70: 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
da80: 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
da90: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b  AX_SQL_LENGTH );
daa0: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
dab0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
dac0: 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49  IT_COLUMN]==SQLI
dad0: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b  TE_MAX_COLUMN );
dae0: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
daf0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
db00: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d  IT_EXPR_DEPTH]==
db10: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
db20: 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
db30: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
db40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
db50: 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c  UND_SELECT]==SQL
db60: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
db70: 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65  _SELECT);.  asse
db80: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
db90: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
dba0: 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  _OP]==SQLITE_MAX
dbb0: 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73  _VDBE_OP );.  as
dbc0: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
dbd0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  [SQLITE_LIMIT_FU
dbe0: 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c  NCTION_ARG]==SQL
dbf0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
dc00: 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74  _ARG );.  assert
dc10: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
dc20: 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
dc30: 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ED]==SQLITE_MAX_
dc40: 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73  ATTACHED );.  as
dc50: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
dc60: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
dc70: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
dc80: 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  H]==.           
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c      SQLITE_MAX_L
dcc0: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
dcd0: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
dce0: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
dcf0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
dd00: 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45  _NUMBER]==SQLITE
dd10: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
dd20: 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28  MBER);.  assert(
dd30: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
dd40: 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
dd50: 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
dd60: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
dd70: 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  H );.  assert( S
dd80: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
dd90: 47 45 52 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49  GER_DEPTH==(SQLI
dda0: 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b  TE_N_LIMIT-1) );
ddb0: 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64  ...  if( limitId
ddc0: 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53  <0 || limitId>=S
ddd0: 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b  QLITE_N_LIMIT ){
dde0: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
ddf0: 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d    }.  oldLimit =
de00: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
de10: 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c  tId];.  if( newL
de20: 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20  imit>=0 ){      
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de40: 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37  IMP: R-52476-287
de50: 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  32 */.    if( ne
de60: 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69  wLimit>aHardLimi
de70: 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20  t[limitId] ){.  
de80: 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61      newLimit = a
de90: 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  HardLimit[limitI
dea0: 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  d];  /* IMP: R-5
deb0: 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20  1463-25634 */.  
dec0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d    }.    db->aLim
ded0: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65  it[limitId] = ne
dee0: 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  wLimit;.  }.  re
def0: 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20  turn oldLimit;  
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33     /* IMP: R-533
df20: 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f  41-35419 */.}../
df30: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
df40: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61  on is used to pa
df50: 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e  rse both URIs an
df60: 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  d non-URI filena
df70: 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68  mes passed by th
df80: 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49  e.** user to API
df90: 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74   functions sqlit
dfa0: 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c  e3_open() or sql
dfb0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20  ite3_open_v2(), 
dfc0: 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65  and for database
dfd0: 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69  .** URIs specifi
dfe0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54  ed as part of AT
dff0: 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e  TACH statements.
e000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
e010: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
e020: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
e030: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  e name of the VF
e040: 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20  S to use (or.** 
e050: 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66  a NULL to signif
e060: 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  y the default VF
e070: 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f  S) if the URI do
e080: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
e090: 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75   "vfs=xxx".** qu
e0a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54  ery parameter. T
e0b0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
e0c0: 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  nt contains the 
e0d0: 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20  URI (or non-URI 
e0e0: 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73  filename).** its
e0f0: 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66  elf. When this f
e100: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
e110: 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61  d the *pFlags va
e120: 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f  riable should co
e130: 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66  ntain.** the def
e140: 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70  ault flags to op
e150: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
e160: 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65  handle with. The
e170: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
e180: 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20  .** *pFlags may 
e190: 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72  be updated befor
e1a0: 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74  e returning if t
e1b0: 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20  he URI filename 
e1c0: 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61  contains .** "ca
e1d0: 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64  che=xxx" or "mod
e1e0: 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72  e=xxx" query par
e1f0: 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  ameters..**.** I
e200: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
e210: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
e220: 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
e230: 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20  e *ppVfs is set 
e240: 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
e250: 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75  he VFS that shou
e260: 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70  ld be used to op
e270: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
e280: 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73  file. *pzFile is
e290: 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74   set to.** point
e2a0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
e2b0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
e2c0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
e2d0: 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20  open. It is the 
e2e0: 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
e2f0: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
e300: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63   to eventually c
e310: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  all sqlite3_free
e320: 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a  () to release.**
e330: 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a   this buffer..**
e340: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
e350: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20  occurs, then an 
e360: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
e370: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
e380: 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d  d *pzErrMsg.** m
e390: 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
e3a0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
e3b0: 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67  ontaining an Eng
e3c0: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
e3d0: 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e  ror .** message.
e3e0: 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
e3f0: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
e400: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
e410: 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a  ually release.**
e420: 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20   this buffer by 
e430: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
e440: 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  free()..*/.int s
e450: 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a  qlite3ParseUri(.
e460: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
e470: 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20  efaultVfs,      
e480: 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20    /* VFS to use 
e490: 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20  if no "vfs=xxx" 
e4a0: 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a  query option */.
e4b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
e4c0: 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ri,             
e4d0: 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
e4e0: 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65  ted URI to parse
e4f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
e500: 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20  nt *pFlags,     
e510: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
e520: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
e530: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69   flags */.  sqli
e540: 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c  te3_vfs **ppVfs,
e550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e560: 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a  UT: VFS to use *
e570: 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69  / .  char **pzFi
e580: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
e590: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c       /* OUT: Fil
e5a0: 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  ename component 
e5b0: 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72  of URI */.  char
e5c0: 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20   **pzErrMsg     
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e5e0: 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  UT: Error messag
e5f0: 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45  e (if rc!=SQLITE
e600: 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  _OK) */.){.  int
e610: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e620: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
e630: 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b  flags = *pFlags;
e640: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e650: 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66  Vfs = zDefaultVf
e660: 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  s;.  char *zFile
e670: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e  ;.  char c;.  in
e680: 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33  t nUri = sqlite3
e690: 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a  Strlen30(zUri);.
e6a0: 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72  .  assert( *pzEr
e6b0: 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  rMsg==0 );..  if
e6c0: 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  ( ((flags & SQLI
e6d0: 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20  TE_OPEN_URI) || 
e6e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
e6f0: 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20  fig.bOpenUri) . 
e700: 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20    && nUri>=5 && 
e710: 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69  memcmp(zUri, "fi
e720: 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20 29  le:", 5)==0 .  )
e730: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  {.    char *zOpt
e740: 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  ;.    int eState
e750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e760: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74      /* Parser st
e770: 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ate when parsing
e780: 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20   URI */.    int 
e790: 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  iIn;            
e7a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
e7b0: 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
e7c0: 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  ex */.    int iO
e7d0: 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
e7e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
e7f0: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
e800: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  x */.    int nBy
e810: 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20  te = nUri+2;    
e820: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e830: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
e840: 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  cate */..    /* 
e850: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51  Make sure the SQ
e860: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c  LITE_OPEN_URI fl
e870: 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64  ag is set to ind
e880: 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53  icate to the VFS
e890: 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d   xOpen .    ** m
e8a0: 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65  ethod that there
e8b0: 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61   may be extra pa
e8c0: 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69  rameters followi
e8d0: 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65  ng the file-name
e8e0: 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  .  */.    flags 
e8f0: 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
e900: 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e  RI;..    for(iIn
e910: 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49  =0; iIn<nUri; iI
e920: 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a  n++) nByte += (z
e930: 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a  Uri[iIn]=='&');.
e940: 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
e950: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
e960: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
e970: 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
e980: 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a  E_NOMEM;..    /*
e990: 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68   Discard the sch
e9a0: 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74  eme and authorit
e9b0: 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68  y segments of th
e9c0: 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66  e URI. */.    if
e9d0: 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26  ( zUri[5]=='/' &
e9e0: 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29  & zUri[6]=='/' )
e9f0: 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
ea00: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55  .      while( zU
ea10: 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
ea20: 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b  iIn]!='/' ) iIn+
ea30: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 49  +;..      if( iI
ea40: 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36  n!=7 && (iIn!=16
ea50: 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61   || memcmp("loca
ea60: 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d  lhost", &zUri[7]
ea70: 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 9)) ){.       
ea80: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
ea90: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e  ite3_mprintf("in
eaa0: 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72  valid uri author
eab0: 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20  ity: %.*s", .   
eac0: 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20           iIn-7, 
ead0: 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20  &zUri[7]);.     
eae0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
eaf0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
eb00: 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
eb10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
eb20: 6c 73 65 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  lse{.      iIn =
eb30: 20 35 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   5;.    }..    /
eb40: 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
eb50: 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
eb60: 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
eb70: 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
eb80: 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
eb90: 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
eba0: 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
ebb0: 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
ebc0: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
ebd0: 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
ebe0: 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
ebf0: 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
ec00: 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
ec10: 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
ec20: 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
ec30: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
ec40: 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
ec50: 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
ec60: 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
ec70: 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
ec80: 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
ec90: 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
eca0: 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
ecb0: 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
ecc0: 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
ecd0: 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
ece0: 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
ecf0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
ed00: 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
ed10: 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
ed20: 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
ed30: 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
ed40: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
ed50: 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
ed60: 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
ed70: 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
ed80: 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
ed90: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
eda0: 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
edb0: 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
edc0: 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
edd0: 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
ede0: 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
edf0: 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
ee00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
ee10: 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
ee20: 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
ee30: 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20  f( octet==0 ){. 
ee40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
ee50: 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
ee60: 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65   when "%00" appe
ee70: 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55  ars within the U
ee80: 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  RI. In this.    
ee90: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65        ** case we
eea0: 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74   ignore all text
eeb0: 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
eec0: 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e  r of the path, n
eed0: 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20  ame or.         
eee0: 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e   ** value curren
eef0: 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64  tly being parsed
ef00: 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  . So ignore the 
ef10: 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65  current characte
ef20: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  r.          ** a
ef30: 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e  nd skip to the n
ef40: 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20  ext "?", "=" or 
ef50: 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  "&", as appropri
ef60: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
ef70: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
ef80: 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
ef90: 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20  !='#' .         
efa0: 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
efb0: 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20  =0 || c!='?').  
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
efd0: 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21  eState!=1 || (c!
efe0: 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29  ='=' && c!='&'))
eff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
f000: 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20  & (eState!=2 || 
f010: 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20  c!='&').        
f020: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
f030: 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
f040: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
f050: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
f060: 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63  }.        c = oc
f070: 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tet;.      }else
f080: 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26   if( eState==1 &
f090: 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d  & (c=='&' || c==
f0a0: 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
f0b0: 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31  if( zFile[iOut-1
f0c0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
f0d0: 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70    /* An empty op
f0e0: 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72  tion name. Ignor
f0f0: 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c  e this option al
f100: 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20  together. */.   
f110: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55         while( zU
f120: 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
f130: 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72  iIn]!='#' && zUr
f140: 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20  i[iIn-1]!='&' ) 
f150: 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
f160: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
f170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
f180: 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20   c=='&' ){.     
f190: 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
f1a0: 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  +] = '\0';.     
f1b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f1c0: 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a      eState = 2;.
f1d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f1e0: 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    c = 0;.      }
f1f0: 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65  else if( (eState
f200: 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c  ==0 && c=='?') |
f210: 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20  | (eState==2 && 
f220: 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20  c=='&') ){.     
f230: 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
f240: 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20    eState = 1;.  
f250: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c      }.      zFil
f260: 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20  e[iOut++] = c;. 
f270: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74     }.    if( eSt
f280: 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69  ate==1 ) zFile[i
f290: 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
f2a0: 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
f2b0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
f2c0: 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
f2d0: 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ';..    /* Check
f2e0: 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61   if there were a
f2f0: 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69  ny options speci
f300: 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64  fied that should
f310: 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
f320: 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70  .    ** here. Op
f330: 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69  tions that are i
f340: 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20  nterpreted here 
f350: 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e  include "vfs" an
f360: 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20  d those that.   
f370: 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74   ** correspond t
f380: 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79  o flags that may
f390: 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
f3a0: 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  e sqlite3_open_v
f3b0: 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  2().    ** metho
f3c0: 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d  d. */.    zOpt =
f3d0: 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53   &zFile[sqlite3S
f3e0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
f3f0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f  ];.    while( zO
f400: 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  pt[0] ){.      i
f410: 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65  nt nOpt = sqlite
f420: 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b  3Strlen30(zOpt);
f430: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61  .      char *zVa
f440: 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31  l = &zOpt[nOpt+1
f450: 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  ];.      int nVa
f460: 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
f470: 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20  n30(zVal);..    
f480: 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26    if( nOpt==3 &&
f490: 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a   memcmp("vfs", z
f4a0: 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 3)==0 ){.  
f4b0: 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61        zVfs = zVa
f4c0: 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  l;.      }else{.
f4d0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f          struct O
f4e0: 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20  penMode {.      
f4f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f500: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  z;.          int
f510: 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
f520: 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20   *aMode = 0;.   
f530: 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65       char *zMode
f540: 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Type = 0;.      
f550: 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
f560: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69          int limi
f570: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  t = 0;..        
f580: 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d  if( nOpt==5 && m
f590: 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a  emcmp("cache", z
f5a0: 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 5)==0 ){.  
f5b0: 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
f5c0: 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
f5d0: 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  CacheMode[] = {.
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73              { "s
f5f0: 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f  hared",  SQLITE_
f600: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
f610: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
f620: 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c  { "private", SQL
f630: 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
f640: 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20  CACHE },.       
f650: 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
f660: 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
f670: 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
f680: 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
f690: 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ACHE|SQLITE_OPEN
f6a0: 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20  _PRIVATECACHE;. 
f6b0: 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
f6c0: 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20   aCacheMode;.   
f6d0: 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
f6e0: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ask;.          z
f6f0: 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68  ModeType = "cach
f700: 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e";.        }.  
f710: 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
f720: 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64  4 && memcmp("mod
f730: 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20  e", zOpt, 4)==0 
f740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
f750: 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d  tic struct OpenM
f760: 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20  ode aOpenMode[] 
f770: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
f780: 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f  { "ro",  SQLITE_
f790: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
f7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
f7b0: 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  rw",  SQLITE_OPE
f7c0: 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a  N_READWRITE }, .
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
f7e0: 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  wc", SQLITE_OPEN
f7f0: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
f800: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
f810: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
f820: 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
f830: 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
f840: 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
f850: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
f860: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
f870: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
f880: 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20  EATE;.          
f890: 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64  aMode = aOpenMod
f8a0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
f8b0: 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67  it = mask & flag
f8c0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  s;.          zMo
f8d0: 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73  deType = "access
f8e0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
f8f0: 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20        if( aMode 
f900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
f910: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
f920: 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  t mode = 0;.    
f930: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
f940: 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b  Mode[i].z; i++){
f950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
f960: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f  st char *z = aMo
f970: 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20  de[i].z;.       
f980: 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73       if( nVal==s
f990: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f9a0: 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  ) && 0==memcmp(z
f9b0: 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b  Val, z, nVal) ){
f9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
f9d0: 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d  ode = aMode[i].m
f9e0: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
f9f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fa00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fa10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
fa20: 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ( mode==0 ){.   
fa30: 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
fa40: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
fa50: 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73  intf("no such %s
fa60: 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64   mode: %s", zMod
fa70: 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
fa80: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
fa90: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
faa0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
fab0: 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
fac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fad0: 20 20 20 69 66 28 20 6d 6f 64 65 3e 6c 69 6d 69     if( mode>limi
fae0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
faf0: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
fb00: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
fb10: 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65   mode not allowe
fb20: 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  d: %s",.        
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29  zModeType, zVal)
fb60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
fb70: 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a   = SQLITE_PERM;.
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
fb90: 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
fba0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
fbb0: 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66        flags = (f
fbc0: 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20  lags & ~mask) | 
fbd0: 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mode;.        }.
fbe0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a        }..      z
fbf0: 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c  Opt = &zVal[nVal
fc00: 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  +1];.    }..  }e
fc10: 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  lse{.    zFile =
fc20: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
fc30: 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28  nUri+2);.    if(
fc40: 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
fc50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fc60: 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
fc70: 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
fc80: 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
fc90: 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
fca0: 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
fcb0: 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20    }..  *ppVfs = 
fcc0: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
fcd0: 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70  (zVfs);.  if( *p
fce0: 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  pVfs==0 ){.    *
fcf0: 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
fd00: 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
fd10: 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56  uch vfs: %s", zV
fd20: 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  fs);.    rc = SQ
fd30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
fd40: 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a   parse_uri_out:.
fd50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fd60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
fd70: 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a  e3_free(zFile);.
fd80: 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20      zFile = 0;. 
fd90: 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66   }.  *pFlags = f
fda0: 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20  lags;.  *pzFile 
fdb0: 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  = zFile;.  retur
fdc0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
fdd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
fde0: 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70  s the work of op
fdf0: 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ening a database
fe00: 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a   on behalf of.**
fe10: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
fe20: 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  and sqlite3_open
fe30: 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61  16(). The databa
fe40: 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69  se filename "zFi
fe50: 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20  lename"  .** is 
fe60: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a  UTF-8 encoded..*
fe70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
fe80: 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e  nDatabase(.  con
fe90: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
fea0: 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20  me, /* Database 
feb0: 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65  filename UTF-8 e
fec0: 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  ncoded */.  sqli
fed0: 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
fee0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
fef0: 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ned database han
ff00: 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  dle */.  unsigne
ff10: 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20  d int flags,    
ff20: 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66  /* Operational f
ff30: 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
ff40: 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
ff50: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
ff60: 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  VFS to use */.){
ff70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f     /* Store allo
ffa0: 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72  cated handle her
ffb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
ffe0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
fff0: 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20  sThreadsafe;    
10000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
10010 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66  ue for threadsaf
10020 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
10030 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d  .  char *zOpen =
10040 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10050 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
10060 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
10070 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a  to BtreeOpen() *
10080 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  /.  char *zErrMs
10090 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
100a0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
100b0 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  sage from sqlite
100c0 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a  3ParseUri() */..
100d0 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
100e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
100f0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
10100 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
10110 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
10120 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
10130 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61  dif..  /* Only a
10140 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
10150 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
10160 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
10170 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
10180 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
10190 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
101a0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
101b0 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
101c0 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
101d0 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
101e0 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
101f0 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
10200 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
10210 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
10220 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
10230 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
10240 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
10250 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
10260 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
10270 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
10280 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
10290 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
102a0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
102b0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
102c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53    */.  assert( S
102d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
102e0 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
102f0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
10300 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
10310 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
10320 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
10330 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
10340 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
10350 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
10360 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
10370 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
10380 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
10390 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
103a0 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
103b0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
103c0 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
103d0 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
103e0 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
103f0 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
10400 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65 74  & 0x46)==0 ) ret
10410 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
10420 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73  E_BKPT;..  if( s
10430 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
10440 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30  ig.bCoreMutex==0
10450 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
10460 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
10470 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
10480 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
10490 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
104a0 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
104b0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
104c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
104d0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
104e0 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20  readsafe = 1;.  
104f0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72  }else{.    isThr
10500 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65  eadsafe = sqlite
10510 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
10520 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20  ullMutex;.  }.  
10530 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
10540 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
10550 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67  ACHE ){.    flag
10560 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
10570 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
10580 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
10590 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
105a0 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
105b0 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  d ){.    flags |
105c0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  = SQLITE_OPEN_SH
105d0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
105e0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d    /* Remove harm
105f0 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68  ful bits from th
10600 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
10610 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  r.  **.  ** The 
10620 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
10630 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  TEX and SQLITE_O
10640 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c  PEN_FULLMUTEX fl
10650 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65  ags were.  ** de
10660 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20  alt with in the 
10670 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c  previous code bl
10680 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68  ock.  Besides th
10690 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20  ese, the only.  
106a0 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66  ** valid input f
106b0 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
106c0 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53  _open_v2() are S
106d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
106e0 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  NLY,.  ** SQLITE
106f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c  _OPEN_READWRITE,
10700 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
10710 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ATE, SQLITE_OPEN
10720 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20  _SHAREDCACHE,.  
10730 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ** SQLITE_OPEN_P
10740 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64  RIVATECACHE, and
10750 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62   some reserved b
10760 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d  its.  Silently m
10770 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c  ask.  ** off all
10780 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20   other flags..  
10790 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e  */.  flags &=  ~
107a0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  ( SQLITE_OPEN_DE
107b0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
107d0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
107e0 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  VE |.           
107f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10800 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20  MAIN_DB |.      
10810 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10820 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a  OPEN_TEMP_DB | .
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10840 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
10850 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20  IENT_DB | .     
10860 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10870 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
10880 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
10890 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
108a0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _TEMP_JOURNAL | 
108b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
108c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
108d0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
108e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
108f0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
10900 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NAL |.          
10910 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10920 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  _NOMUTEX |.     
10930 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10940 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
10950 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
10960 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
10970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  .             );
10980 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
10990 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20  the sqlite data 
109a0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64  structure */.  d
109b0 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  b = sqlite3Mallo
109c0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71  cZero( sizeof(sq
109d0 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20  lite3) );.  if( 
109e0 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65  db==0 ) goto ope
109f0 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69  ndb_out;.  if( i
10a00 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20  sThreadsafe ){. 
10a10 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73     db->mutex = s
10a20 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10a30 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
10a40 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CURSIVE);.    if
10a50 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  ( db->mutex==0 )
10a60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
10a70 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20  free(db);.      
10a80 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  db = 0;.      go
10a90 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
10aa0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
10ab0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10ac0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
10ad0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b  >errMask = 0xff;
10ae0 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
10af0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
10b00 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
10b10 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
10b20 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61  >aDbStatic;..  a
10b30 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
10b40 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
10b50 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
10b60 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
10b70 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
10b80 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
10b90 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74  mit));.  db->aut
10ba0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64  oCommit = 1;.  d
10bb0 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d  b->nextAutovac =
10bc0 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50   -1;.  db->nextP
10bd0 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64  agesize = 0;.  d
10be0 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
10bf0 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
10c00 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   | SQLITE_AutoIn
10c10 64 65 78 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61  dex | SQLITE_Ena
10c20 62 6c 65 54 72 69 67 67 65 72 0a 23 69 66 20 53  bleTrigger.#if S
10c30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
10c40 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20  LE_FORMAT<4.    
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
10c60 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
10c70 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Fmt.#endif.#ifde
10c80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10c90 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  | SQLITE_LoadExt
10cc0 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69  ension.#endif.#i
10cd0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
10ce0 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47  _RECURSIVE_TRIGG
10cf0 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERS.            
10d00 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
10d10 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66  cTriggers.#endif
10d20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
10d30 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
10d40 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c  IGN_KEYS) && SQL
10d50 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
10d60 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20  IGN_KEYS.       
10d70 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
10d80 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23  TE_ForeignKeys.#
10d90 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
10da0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
10db0 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
10dc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10dd0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10de0 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
10df0 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
10e00 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
10e10 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
10e20 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
10e30 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
10e40 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
10e50 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
10e60 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
10e70 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
10e80 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
10e90 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
10ea0 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
10eb0 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
10ec0 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
10ed0 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
10ee0 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65  lure..  */.  cre
10ef0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
10f00 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
10f10 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f  E_UTF8, 0, binCo
10f20 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
10f30 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
10f40 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
10f50 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62  TE_UTF16BE, 0, b
10f60 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
10f70 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
10f80 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
10f90 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
10fa0 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
10fb0 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
10fc0 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d  ation(db, "RTRIM
10fd0 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
10fe0 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c  (void*)1, binCol
10ff0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
11000 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11010 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
11020 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
11030 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20  db->pDfltColl = 
11040 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
11050 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
11060 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29  F8, "BINARY", 0)
11070 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
11080 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pDfltColl!=0 );.
11090 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61  .  /* Also add a
110a0 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65   UTF-8 case-inse
110b0 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f  nsitive collatio
110c0 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20  n sequence. */. 
110d0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
110e0 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
110f0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e  QLITE_UTF8, 0, n
11100 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
11110 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61  nc, 0);..  /* Pa
11120 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rse the filename
11130 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a  /URI argument. *
11140 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67  /.  db->openFlag
11150 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20  s = flags;.  rc 
11160 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  = sqlite3ParseUr
11170 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  i(zVfs, zFilenam
11180 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e  e, &flags, &db->
11190 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a  pVfs, &zOpen, &z
111a0 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
111b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
111c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
111d0 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d  TE_NOMEM ) db->m
111e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
111f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11200 72 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73  r(db, rc, zErrMs
11210 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45  g ? "%s" : 0, zE
11220 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
11230 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
11240 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
11250 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
11260 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65  * Open the backe
11270 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76  nd database driv
11280 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  er */.  rc = sql
11290 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
112a0 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64  ->pVfs, zOpen, d
112b0 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  b, &db->aDb[0].p
112c0 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  Bt, 0,.         
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
112e0 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50  lags | SQLITE_OP
112f0 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69  EN_MAIN_DB);.  i
11300 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11310 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
11320 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
11330 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EM ){.      rc =
11340 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11350 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11360 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
11370 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
11380 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
11390 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
113a0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
113b0 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
113c0 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
113d0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
113e0 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
113f0 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54  db, 0);...  /* T
11400 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
11410 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
11420 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
11430 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65   'full'; for the
11440 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
11450 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27  ase it is 'NONE'
11460 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
11470 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
11480 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
11490 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
114a0 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
114b0 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
114c0 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62  _level = 3;.  db
114d0 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[1].zName =
114e0 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
114f0 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
11500 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d  el = 1;..  db->m
11510 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
11520 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
11530 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11540 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
11550 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
11560 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
11570 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
11580 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
11590 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
115a0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
115b0 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
115c0 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
115d0 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
115e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
115f0 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
11600 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
11610 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
11620 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
11630 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
11640 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
11650 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
11660 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
11670 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
11680 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
11690 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
116a0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
116b0 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
116c0 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72  () API..  */.  r
116d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
116e0 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ode(db);.  if( r
116f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11700 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c      sqlite3AutoL
11710 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
11720 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
11730 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
11740 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11760 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
11770 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
11780 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11790 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d  _FTS1.  if( !db-
117a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
117b0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
117c0 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
117d0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
117e0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49  c = sqlite3Fts1I
117f0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
11800 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
11810 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20  TE_ENABLE_FTS2. 
11820 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
11830 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
11840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65  LITE_OK ){.    e
11850 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
11860 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65  3Fts2Init(sqlite
11870 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
11880 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62  lite3Fts2Init(db
11890 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
118a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
118b0 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21  BLE_FTS3.  if( !
118c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
118d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
118e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
118f0 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62  lite3Fts3Init(db
11900 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
11910 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11920 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64  BLE_ICU.  if( !d
11930 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11940 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
11950 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11960 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b  ite3IcuInit(db);
11970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
11980 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11990 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64  E_RTREE.  if( !d
119a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
119b0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
119c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
119d0 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29  te3RtreeInit(db)
119e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
119f0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
11a00 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d   rc, 0);..  /* -
11a10 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  DSQLITE_DEFAULT_
11a20 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d  LOCKING_MODE=1 m
11a30 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74  akes EXCLUSIVE t
11a40 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
11a50 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d  ng.  ** mode.  -
11a60 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  DSQLITE_DEFAULT_
11a70 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d  LOCKING_MODE=0 m
11a80 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  ake NORMAL the d
11a90 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
11aa0 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67   ** mode.  Doing
11ab0 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20   nothing at all 
11ac0 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41  also makes NORMA
11ad0 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20  L the default.. 
11ae0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
11af0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
11b00 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c  G_MODE.  db->dfl
11b10 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49  tLockMode = SQLI
11b20 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
11b30 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74  NG_MODE;.  sqlit
11b40 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
11b50 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  de(sqlite3BtreeP
11b60 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  ager(db->aDb[0].
11b70 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  pBt),.          
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
11ba0 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65  OCKING_MODE);.#e
11bb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  ndif..  /* Enabl
11bc0 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
11bd0 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
11be0 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
11bf0 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
11c00 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11c10 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
11c40 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
11c50 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
11c60 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
11c70 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
11c80 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
11c90 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
11ca0 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ndb_out:.  sqlit
11cb0 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a  e3_free(zOpen);.
11cc0 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
11cd0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65  assert( db->mute
11ce0 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64  x!=0 || isThread
11cf0 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  safe==0 || sqlit
11d00 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
11d10 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  FullMutex==0 );.
11d20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
11d30 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
11d40 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  x);.  }.  rc = s
11d50 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
11d60 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
11d70 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
11d80 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28  E_NOMEM );.  if(
11d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
11da0 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
11db0 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
11dc0 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
11dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11de0 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
11df0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
11e00 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70  C_SICK;.  }.  *p
11e10 70 44 62 20 3d 20 64 62 3b 0a 20 20 72 65 74 75  pDb = db;.  retu
11e20 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
11e30 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  t(0, rc);.}../*.
11e40 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
11e50 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
11e60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
11e70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
11e80 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
11e90 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a  sqlite3 **ppDb .
11ea0 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
11eb0 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61  Database(zFilena
11ec0 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  me, ppDb,.      
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11ef0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
11f00 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
11f10 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  }.int sqlite3_op
11f20 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63  en_v2(.  const c
11f30 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20  har *filename,  
11f40 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
11f50 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f  ename (UTF-8) */
11f60 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
11f70 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  b,         /* OU
11f80 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e  T: SQLite db han
11f90 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dle */.  int fla
11fa0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
11fb0 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63   /* Flags */.  c
11fc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
11fd0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
11fe0 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20  f VFS module to 
11ff0 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  use */.){.  retu
12000 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
12010 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20  filename, ppDb, 
12020 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c  (unsigned int)fl
12030 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23  ags, zVfs);.}..#
12040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12050 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f  IT_UTF16./*.** O
12060 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
12070 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
12080 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  t sqlite3_open16
12090 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  (.  const void *
120a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
120b0 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a  lite3 **ppDb.){.
120c0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
120d0 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a  ilename8;   /* z
120e0 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64  Filename encoded
120f0 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61   in UTF-8 instea
12100 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20  d of UTF-16 */. 
12110 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
12120 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVal;.  int rc;.
12130 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
12140 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74  name );.  assert
12150 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44  ( ppDb );.  *ppD
12160 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
12170 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
12180 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
12190 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
121a0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
121b0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20  rn rc;.#endif.  
121c0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
121d0 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
121e0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
121f0 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  pVal, -1, zFilen
12200 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ame, SQLITE_UTF1
12210 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f  6NATIVE, SQLITE_
12220 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65  STATIC);.  zFile
12230 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56  name8 = sqlite3V
12240 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
12250 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69  QLITE_UTF8);.  i
12260 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b  f( zFilename8 ){
12270 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61  .    rc = openDa
12280 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
12290 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  8, ppDb,.       
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
122b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
122c0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
122d0 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20  EN_CREATE, 0);. 
122e0 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62     assert( *ppDb
122f0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
12300 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20  OMEM );.    if( 
12310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12320 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
12330 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68  *ppDb, 0, DB_Sch
12340 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20  emaLoaded) ){.  
12350 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d      ENC(*ppDb) =
12360 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
12370 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  IVE;.    }.  }el
12380 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
12390 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
123a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
123b0 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
123c0 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  rn sqlite3ApiExi
123d0 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64  t(0, rc);.}.#end
123e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
123f0 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
12400 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
12410 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12420 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
12430 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
12440 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
12450 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
12460 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
12470 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
12480 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
12490 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
124a0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
124b0 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
124c0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
124d0 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
124e0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
124f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12500 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
12510 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
12520 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
12530 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
12540 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e  b, zName, (u8)en
12550 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
12560 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  e, 0);.  rc = sq
12570 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
12580 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
12590 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
125a0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
125b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
125c0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
125d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
125e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
125f0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
12600 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
12610 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
12620 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
12630 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12640 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
12650 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
12660 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
12670 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
12680 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
12690 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
126a0 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
126b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
126c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
126d0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
126e0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
126f0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
12700 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
12710 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
12720 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
12730 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
12740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
12750 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
12760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12770 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12790 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
127a0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
127b0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
127c0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
127d0 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
127e0 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
127f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
12800 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
12810 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
12820 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
12830 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
12840 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
12850 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
12860 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
12870 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
12880 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
12890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
128a0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
128b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
128c0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
128d0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
128e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
128f0 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
12900 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
12910 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
12920 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
12930 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
12940 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
12950 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
12960 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
12970 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
12980 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
12990 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
129a0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
129b0 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
129c0 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
129d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
129e0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
129f0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
12a00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
12a10 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
12a20 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
12a30 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
12a40 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
12a50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12a60 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
12a70 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
12a80 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
12a90 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12aa0 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
12ab0 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
12ac0 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
12ad0 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
12ae0 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
12af0 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
12b00 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
12b10 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
12b20 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
12b30 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
12b40 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
12b50 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
12b60 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
12b70 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
12b80 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
12b90 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
12ba0 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
12bb0 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
12bc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12bd0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
12be0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c00 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
12c10 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
12c20 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
12c30 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
12c40 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
12c50 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
12c60 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
12c70 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
12c80 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12c90 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
12ca0 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
12cb0 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
12cc0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
12cd0 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
12ce0 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
12cf0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(v
12d00 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
12d10 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
12d20 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c   void*).){.  sql
12d30 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12d40 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
12d50 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
12d60 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e   0;.  db->xCollN
12d70 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e  eeded16 = xCollN
12d80 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70  eeded16;.  db->p
12d90 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
12da0 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
12db0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12dc0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12dd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12de0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
12df0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
12e00 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
12e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
12e20 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
12e30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
12e40 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d  w an anachronism
12e50 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  . It used to be 
12e60 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20  used to recover 
12e70 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63  from a.** malloc
12e80 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20  () failure, but 
12e90 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20  SQLite now does 
12ea0 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  this automatical
12eb0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
12ec0 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
12ed0 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  r(void){.  retur
12ee0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
12ef0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
12f00 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
12f10 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
12f20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12f30 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
12f40 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72  .** mode.  Retur
12f50 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
12f60 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
12f70 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  .  Autocommit mo
12f80 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64  de is on.** by d
12f90 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d  efault.  Autocom
12fa0 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20  mit is disabled 
12fb0 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  by a BEGIN state
12fc0 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c  ment and reenabl
12fd0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78  ed.** by the nex
12fe0 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  t COMMIT or ROLL
12ff0 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  BACK..**.*******
13000 20 54 48 49 53 20 49 53 20 41 4e 20 45 58 50 45   THIS IS AN EXPE
13010 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e 44  RIMENTAL API AND
13020 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f 20 43   IS SUBJECT TO C
13030 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a  HANGE ******.*/.
13040 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
13050 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
13060 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
13070 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  n db->autoCommit
13080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
13090 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
130a0 73 20 61 72 65 20 73 75 62 74 69 74 75 74 65 73  s are subtitutes
130b0 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53   for constants S
130c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a  QLITE_CORRUPT,.*
130d0 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  * SQLITE_MISUSE,
130e0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
130f0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61  , SQLITE_IOERR a
13100 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65  nd possibly othe
13110 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74  r error.** const
13120 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76  ants.  They serv
13130 65 72 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a  er two purposes:
13140 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72  .**.**   1.  Ser
13150 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65  ve as a convenie
13160 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20  nt place to set 
13170 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20  a breakpoint in 
13180 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20  a debugger.**   
13190 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68      to detect wh
131a0 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72  en version error
131b0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75   conditions occu
131c0 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20  rs..**.**   2.  
131d0 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c  Invoke sqlite3_l
131e0 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20  og() to provide 
131f0 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
13200 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a  location where.*
13210 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65  *       a low-le
13220 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72  vel error is fir
13230 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a  st detected..*/.
13240 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
13250 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
13260 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
13270 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13280 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
13290 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
132a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20  LITE_CORRUPT,.  
132b0 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74              "dat
132c0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
132d0 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
132e0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
132f0 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
13300 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
13310 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
13320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
13330 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73  }.int sqlite3Mis
13340 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  useError(int lin
13350 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
13360 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
13370 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
13380 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
13390 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20  QLITE_MISUSE, . 
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 69               "mi
133b0 73 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20  suse at line %d 
133c0 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
133d0 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
133e0 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
133f0 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
13400 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
13410 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  E;.}.int sqlite3
13420 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e  CantopenError(in
13430 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
13440 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
13450 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
13460 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
13470 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  log(SQLITE_CANTO
13480 50 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  PEN, .          
13490 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e      "cannot open
134a0 20 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64   file at line %d
134b0 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
134c0 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
134d0 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
134e0 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
134f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
13500 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  OPEN;.}...#ifnde
13510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
13520 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
13530 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  his is a conveni
13540 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61  ence routine tha
13550 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  t makes sure tha
13560 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65  t all thread-spe
13570 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f  cific.** data fo
13580 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61  r this thread ha
13590 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
135a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ed..**.** SQLite
135b0 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
135c0 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
135d0 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75  data so this rou
135e0 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a  tine is now a.**
135f0 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72   no-op.  It is r
13600 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74  etained for hist
13610 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
13620 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lity..*/.void sq
13630 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
13640 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65  anup(void){.}.#e
13650 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
13660 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
13670 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
13680 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
13690 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
136a0 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
136b0 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
136c0 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
136d0 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65  etails..*/.#ifde
136e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
136f0 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
13700 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
13710 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
13720 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
13730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13740 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
13750 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
13760 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
13770 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13780 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
13790 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
137a0 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
137b0 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
137c0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
137d0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
137e0 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
137f0 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
13800 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
13810 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
13820 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
13830 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
13840 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
13850 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
13860 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
13870 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
13880 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
13890 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
138a0 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
138b0 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
138c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
138d0 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
138e0 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
138f0 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
13900 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
13910 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
13920 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
13930 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
13940 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
13950 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
13960 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
13970 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
13980 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
13990 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
139a0 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63    int iCol;..  c
139b0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
139c0 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
139d0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
139e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
139f0 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
13a00 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
13a10 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
13a20 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  ;..  /* Ensure t
13a30 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
13a40 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64  ma has been load
13a50 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
13a60 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
13a70 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
13a80 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
13a90 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
13aa0 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  e3Init(db, &zErr
13ab0 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  Msg);.  if( SQLI
13ac0 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
13ad0 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
13ae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
13af0 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71  e the table in q
13b00 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61  uestion */.  pTa
13b10 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
13b20 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e  able(db, zTableN
13b30 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  ame, zDbName);. 
13b40 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54   if( !pTab || pT
13b50 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
13b60 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
13b70 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
13b80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
13b90 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77  the column for w
13ba0 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71  hich info is req
13bb0 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  uested */.  if( 
13bc0 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
13bd0 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
13be0 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
13bf0 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69  iPKey;.    if( i
13c00 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
13c10 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
13c20 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  ol[iCol];.    }.
13c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
13c40 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
13c50 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
13c60 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
13c70 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
13c80 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
13c90 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
13ca0 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
13cb0 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
13cc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13cd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13ce0 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f   iCol==pTab->nCo
13cf0 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  l ){.      pTab 
13d00 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
13d10 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
13d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
13d30 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
13d40 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69  tores the meta i
13d50 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
13d60 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
13d70 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  .  ** to the cal
13d80 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  ler in local var
13d90 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65  iables zDataType
13da0 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e  , zCollSeq, notn
13db0 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a  ull, primarykey.
13dc0 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63    ** and autoinc
13dd0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
13de0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  there are two po
13df0 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a  ssibilities:.  *
13e00 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54  * .  **     1. T
13e10 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  he specified col
13e20 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77  umn name was row
13e30 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f  id", "oid" or "_
13e40 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20  rowid_" .  **   
13e50 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69       and there i
13e60 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  s no explicitly 
13e70 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c  declared IPK col
13e80 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  umn. .  **.  ** 
13e90 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65      2. The table
13ea0 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61   is not a view a
13eb0 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  nd the column na
13ec0 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e  me identified an
13ed0 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78   .  **        ex
13ee0 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
13ef0 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d  d column. Copy m
13f00 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
13f10 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f  from *pCol..  */
13f20 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a   .  if( pCol ){.
13f30 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
13f40 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
13f50 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c   zCollSeq = pCol
13f60 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74  ->zColl;.    not
13f70 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74  null = pCol->not
13f80 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69  Null!=0;.    pri
13f90 6d 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d  marykey  = pCol-
13fa0 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20  >isPrimKey!=0;. 
13fb0 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
13fc0 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
13fd0 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
13fe0 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
13ff0 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
14000 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
14010 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
14020 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
14030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
14040 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
14050 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
14060 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
14070 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
14080 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
14090 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
140a0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
140b0 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
140c0 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
140d0 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
140e0 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
140f0 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
14100 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
14110 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
14120 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
14130 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
14140 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
14150 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
14160 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
14170 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
14180 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
14190 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
141a0 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
141b0 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
141c0 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
141d0 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
141e0 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
141f0 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
14200 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
14210 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
14220 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
14230 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
14240 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
14250 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
14260 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
14270 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
14280 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
14290 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
142a0 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
142b0 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
142c0 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
142d0 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
142e0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
142f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
14300 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  ror(db, rc, (zEr
14310 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
14320 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
14330 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
14340 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
14350 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
14360 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
14370 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
14380 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
14390 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
143a0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
143b0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
143c0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
143d0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
143e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
143f0 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
14400 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
14410 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
14420 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
14430 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
14440 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
14450 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
14460 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
14470 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
14480 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
14490 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
144a0 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
144b0 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
144c0 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
144d0 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
144e0 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
144f0 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
14500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14510 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
14520 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
14530 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
14540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
14550 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
14560 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
14570 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20  b, int onoff){. 
14580 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14590 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
145a0 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
145b0 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
145c0 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
145d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
145e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
145f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
14610 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
14620 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
14630 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
14640 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
14650 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
14660 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
14670 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
14680 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
14690 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
146a0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
146b0 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
146c0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
146d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
146e0 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73  x);.  pBtree = s
146f0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
14700 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
14710 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
14720 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
14730 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
14740 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73  _file *fd;.    s
14750 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14760 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50  (pBtree);.    pP
14770 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
14780 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
14790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
147a0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66  ager!=0 );.    f
147b0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
147c0 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
147d0 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
147e0 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
147f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
14800 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
14810 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
14820 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
14830 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14840 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
14850 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
14860 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
14870 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
14880 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
14890 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
148a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
148b0 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
148c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
148d0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
148e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
148f0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
14900 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
14910 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65    .}../*.** Inte
14920 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
14930 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
14940 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
14950 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
14960 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
14970 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
14980 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
14990 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
149a0 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
149b0 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
149c0 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
149d0 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
149e0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
149f0 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
14a00 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14a10 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
14a20 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
14a30 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
14a40 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
14a50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
14a60 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
14a70 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
14a80 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
14a90 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
14aa0 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
14ab0 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
14ac0 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
14ad0 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
14ae0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
14af0 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
14b00 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
14b10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
14b20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
14b30 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
14b40 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
14b50 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
14b60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14b70 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
14b80 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
14b90 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
14ba0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
14bb0 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
14bc0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
14bd0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
14be0 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
14bf0 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
14c00 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
14c10 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
14c20 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
14c30 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
14c40 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
14c50 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
14c60 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
14c70 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74  sqlite3PrngReset
14c80 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
14c90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
14ca0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
14cb0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
14cc0 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
14cd0 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
14ce0 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
14cf0 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
14d00 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
14d10 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
14d20 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
14d30 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
14d40 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
14d50 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
14d60 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
14d70 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
14d80 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
14d90 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
14da0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
14db0 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
14dc0 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
14dd0 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
14de0 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
14df0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
14e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
14e10 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
14e20 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
14e30 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
14e40 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
14e50 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
14e60 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
14e70 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
14e80 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
14e90 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
14ea0 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
14eb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
14ec0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
14ed0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
14ee0 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
14ef0 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
14f00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
14f10 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
14f20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
14f30 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
14f40 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
14f50 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
14f60 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
14f70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
14f80 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
14f90 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
14fa0 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
14fb0 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
14fc0 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
14fd0 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
14fe0 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
14ff0 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
15000 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
15010 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
15020 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
15030 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
15040 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
15050 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
15060 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
15070 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
15080 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
15090 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
150a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
150b0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
150c0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
150d0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
150e0 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
150f0 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
15100 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
15110 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
15120 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
15130 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
15140 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
15150 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
15160 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
15170 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
15180 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
15190 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
151a0 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
151b0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
151c0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
151d0 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
151e0 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
151f0 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
15200 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
15210 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
15220 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
15230 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
15240 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
15250 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
15260 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
15270 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15280 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
15290 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
152a0 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72 69  .    ** dileteri
152b0 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
152c0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
152d0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
152e0 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
152f0 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
15300 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
15310 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
15320 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
15330 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
15340 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
15350 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
15360 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
15370 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
15380 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
15390 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
153a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
153b0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
153c0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
153d0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
153e0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
153f0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
15400 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
15410 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
15420 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
15430 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
15440 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
15450 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
15460 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
15470 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
15480 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
15490 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
154a0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
154b0 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
154c0 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
154d0 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
154e0 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
154f0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
15500 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
15510 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
15520 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
15530 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
15540 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
15550 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
15560 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
15570 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
15580 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
15590 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
155a0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
155b0 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
155c0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
155d0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
155e0 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
155f0 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
15600 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15610 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
15620 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
15630 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
15640 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
15650 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
15660 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
15670 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
15680 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
15690 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
156a0 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
156b0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
156c0 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
156d0 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
156e0 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
156f0 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
15700 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
15710 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
15720 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
15730 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20  s ALWAYS(X).  . 
15740 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
15750 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73   recommended tes
15760 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74  t is X==2.  If t
15770 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
15780 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 2, that means
15790 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29  .    ** ALWAYS()
157a0 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
157b0 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73   both no-op pass
157c0 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c  -through macros,
157d0 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20   which is the.  
157e0 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74    ** default set
157f0 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65  ting.  If the re
15800 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c  turn value is 1,
15810 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69   then ALWAYS() i
15820 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  s either.    ** 
15830 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
15840 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73  ue or else it as
15850 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67  serts if its arg
15860 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a  ument is false..
15870 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
15880 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d   behavior (hard-
15890 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69  coded to true) i
158a0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
158b0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
158c0 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
158d0 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
158e0 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  is disabled and 
158f0 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
15900 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65  * behavior (asse
15910 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  rt if the argume
15920 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69  nt to ALWAYS() i
15930 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20  s false) is the 
15940 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
15950 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
15960 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
15970 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
15980 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  bled..    **.   
15990 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65   ** The run-time
159a0 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20   test procedure 
159b0 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74  might look somet
159c0 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
159d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
159e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
159f0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
15a00 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
15a10 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a  , 2)==2 ){.    *
15a20 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
15a30 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
15a40 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  re no-op pass-th
15a50 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20  rough macros.   
15a60 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   **    }else if(
15a70 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
15a80 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
15a90 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29  TCTRL_ASSERT, 1)
15aa0 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   ){.    **      
15ab0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73  // ALWAYS(x) ass
15ac0 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74  erts that x is t
15ad0 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73  rue. NEVER(x) as
15ae0 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65  serts x is false
15af0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  ..    **    }els
15b00 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  e{.    **      /
15b10 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61  / ALWAYS(x) is a
15b20 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45   constant 1.  NE
15b30 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73  VER(x) is a cons
15b40 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20  tant 0..    **  
15b50 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63    }.    */.    c
15b60 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
15b70 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20  TRL_ALWAYS: {.  
15b80 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
15b90 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
15ba0 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29    rc = ALWAYS(x)
15bb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15bc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
15bd0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
15be0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
15bf0 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c  TRL_RESERVE, sql
15c00 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
15c10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
15c20 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  et the nReserve 
15c30 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68  size to N for th
15c40 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15c50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
15c60 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f      ** connectio
15c70 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  n db..    */.   
15c80 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
15c90 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b  TCTRL_RESERVE: {
15ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
15cb0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
15cc0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
15cd0 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
15ce0 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  ap,int);.      s
15cf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15d00 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
15d10 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
15d20 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d  eSetPageSize(db-
15d30 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20  >aDb[0].pBt, 0, 
15d40 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  x, 0);.      sql
15d50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15d60 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
15d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15d80 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
15d90 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
15da0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
15db0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c  TIMIZATIONS, sql
15dc0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
15dd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
15de0 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
15df0 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
15e00 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69  ations for testi
15e10 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
15e20 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  e .    ** argume
15e30 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73  nt N is a bitmas
15e40 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
15e50 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ns to be disable
15e60 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20  d.  For normal. 
15e70 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20     ** operation 
15e80 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20  N should be 0.  
15e90 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
15ea0 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20   a test program 
15eb0 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a  (like the.    **
15ec0 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20   SQL Logic Test 
15ed0 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75  or SLT test modu
15ee0 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20  le) can run the 
15ef0 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c  same SQL multipl
15f00 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77  e times.    ** w
15f10 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ith various opti
15f20 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c  mizations disabl
15f30 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
15f40 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  t the same answe
15f50 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61  r.    ** is obta
15f60 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61  ined in every ca
15f70 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
15f80 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
15f90 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
15fa0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
15fb0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
15fc0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
15fd0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
15fe0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
15ff0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
16000 78 20 26 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61  x & SQLITE_OptMa
16010 73 6b 29 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  sk) | (db->flags
16020 20 26 20 7e 53 51 4c 49 54 45 5f 4f 70 74 4d 61   & ~SQLITE_OptMa
16030 73 6b 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sk);.      break
16040 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
16050 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
16060 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
16070 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
16080 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
16090 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68  EYWORD, const ch
160a0 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a  ar *zWord).    *
160b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72  *.    ** If zWor
160c0 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72  d is a keyword r
160d0 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65  ecognized by the
160e0 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65   parser, then re
160f0 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  turn the.    ** 
16100 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72  number of keywor
16110 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64  ds.  Or if zWord
16120 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72   is not a keywor
16130 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20  d, return 0..   
16140 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73   ** .    ** This
16150 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69 73   test feature is
16160 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
16170 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  in the amalgamat
16180 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a  ion since.    **
16190 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45   the SQLITE_N_KE
161a0 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e  YWORD macro is n
161b0 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ot defined in th
161c0 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74  is file if SQLit
161d0 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c  e.    ** is buil
161e0 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  t using separate
161f0 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20   source files.. 
16200 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16210 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
16220 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20  SKEYWORD: {.    
16230 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
16240 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ord = va_arg(ap,
16250 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20   const char*);. 
16260 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
16270 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f  ite3Strlen30(zWo
16280 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rd);.      rc = 
16290 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43  (sqlite3KeywordC
162a0 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20  ode((u8*)zWord, 
162b0 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c  n)!=TK_ID) ? SQL
162c0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20  ITE_N_KEYWORD : 
162d0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
162e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20      }.#endif .. 
162f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
16300 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
16310 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
16320 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70  CHMALLOC, sz, &p
16330 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  New, pFree);.   
16340 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20   **.    ** Pass 
16350 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74  pFree into sqlit
16360 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e  e3ScratchFree().
16370 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30   .    ** If sz>0
16380 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
16390 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20   scratch buffer 
163a0 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20  into pNew.  .   
163b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
163c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
163d0 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ATCHMALLOC: {.  
163e0 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c      void *pFree,
163f0 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20   **ppNew;.      
16400 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a  int sz;.      sz
16410 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
16420 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20  t);.      ppNew 
16430 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
16440 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65  d**);.      pFre
16450 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
16460 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28  oid*);.      if(
16470 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73   sz ) *ppNew = s
16480 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
16490 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73  loc(sz);.      s
164a0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
164b0 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
164c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
164d0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
164e0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
164f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
16500 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74  LTIME_FAULT, int
16510 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
16520 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
16530 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
16540 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65  -zero, configure
16550 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f   the wrappers so
16560 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a   that all.    **
16570 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
16580 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29  s to localtime()
16590 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61   and variants fa
165a0 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
165b0 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64  zero,.    ** und
165c0 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
165d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
165e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
165f0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
16600 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16610 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
16620 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
16630 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
16640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16650 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
16660 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
16670 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 20 20  EE_EXPLAIN).    
16680 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
16690 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
166a0 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41 49  _TESTCTRL_EXPLAI
166b0 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a 2a 20 20  N_STMT,.    **  
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
166e0 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a  mt*,const char**
166f0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
16700 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   If compiled wit
16710 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  h SQLITE_ENABLE_
16720 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c 20 65 61  TREE_EXPLAIN, ea
16730 63 68 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ch sqlite3_stmt 
16740 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20 61 20 73  holds.    ** a s
16750 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
16760 69 62 65 73 20 74 68 65 20 6f 70 74 69 6d 69 7a  ibes the optimiz
16770 65 64 20 70 61 72 73 65 20 74 72 65 65 2e 20 20  ed parse tree.  
16780 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f  This test-contro
16790 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 73  l.    ** returns
167a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
167b0 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a  at string..    *
167c0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
167d0 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41  E_TESTCTRL_EXPLA
167e0 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20  IN_STMT: {.     
167f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16800 53 74 6d 74 20 3d 20 76 61 5f 61 72 67 28 61 70  Stmt = va_arg(ap
16810 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29  , sqlite3_stmt*)
16820 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
16830 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20 76 61 5f  ar **pzRet = va_
16840 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
16850 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20 2a 70 7a  ar**);.      *pz
16860 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Ret = sqlite3Vdb
16870 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 28 56 64  eExplanation((Vd
16880 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20 20 20  be*)pStmt);.    
16890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
168a0 65 6e 64 69 66 0a 0a 20 20 7d 0a 20 20 76 61 5f  endif..  }.  va_
168b0 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20  end(ap);.#endif 
168c0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
168d0 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20  UILTIN_TEST */. 
168e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
168f0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
16900 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20  tility routine, 
16910 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d  useful to VFS im
16920 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74  plementations, t
16930 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f  hat checks.** to
16940 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61   see if a databa
16950 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52  se file was a UR
16960 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64  I that contained
16970 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72   a specific quer
16980 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c  y .** parameter,
16990 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69   and if so obtai
169a0 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
169b0 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  the query parame
169c0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  ter..**.** The z
169d0 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
169e0 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d  t is the filenam
169f0 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  e pointer passed
16a00 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28   into the xOpen(
16a10 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61  ).** method of a
16a20 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
16a30 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d  ion.  The zParam
16a40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
16a50 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
16a60 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
16a70 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72  we seek.  This r
16a80 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
16a90 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
16aa0 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65  zParam.** parame
16ab0 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73  ter if it exists
16ac0 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
16ad0 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ter does not exi
16ae0 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
16af0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55  .** returns a NU
16b00 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
16b10 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
16b20 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
16b30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
16b40 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
16b50 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69  ar *zParam){.  i
16b60 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
16b70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
16b80 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
16b90 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
16ba0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
16bb0 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
16bc0 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
16bd0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
16be0 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
16bf0 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
16c00 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
16c10 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
16c20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
16c30 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
16c40 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
16c50 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
16c60 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
16c70 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16c80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
16c90 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
16ca0 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
16cb0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
16cc0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
16cd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
16ce0 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
16cf0 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
16d00 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
16d10 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
16d20 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
16d30 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
16d40 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
16d50 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
16d60 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
16d70 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
16d80 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
16d90 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
16da0 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
16db0 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
16dc0 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
16dd0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
16de0 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
16df0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
16e00 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
16e10 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
16e20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
16e30 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
16e40 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
16e50 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
16e60 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
16e70 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
16e80 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
16e90 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
16ea0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
16eb0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
16ec0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
16ed0 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
16ee0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
16ef0 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
16f00 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26  lite3Atoi64(z, &
16f10 76 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  v, sqlite3Strlen
16f20 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
16f30 46 38 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  F8)==SQLITE_OK )
16f40 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b  {.    bDflt = v;
16f50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44  .  }.  return bD
16f60 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
16f70 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20 70  turn the Btree p
16f80 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65  ointer identifie
16f90 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52  d by zDbName.  R
16fa0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
16fb0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65  t found..*/.Btre
16fc0 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65  e *sqlite3DbName
16fd0 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33 20  ToBtree(sqlite3 
16fe0 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
16ff0 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  *zDbName){.  int
17000 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
17010 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
17020 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
17030 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26 20 28  i].pBt.     && (
17040 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  zDbName==0 || sq
17050 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
17060 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d  Name, db->aDb[i]
17070 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20  .zName)==0).    
17080 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17090 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
170a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
170b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
170c0 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61  eturn the filena
170d0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
170e0 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
170f0 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  th a database.**
17100 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
17110 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
17120 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
17130 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
17140 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
17150 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  ){.  Btree *pBt 
17160 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
17170 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
17180 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
17190 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
171a0 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29  GetFilename(pBt)
171b0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
171c0 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61 62  eturn 1 if datab
171d0 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ase is read-only
171e0 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77 72   or 0 if read/wr
171f0 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ite.  Return -1 
17200 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61  if.** no such da
17210 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a  tabase exists..*
17220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
17230 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65  _readonly(sqlite
17240 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
17250 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
17260 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69  tree *pBt = sqli
17270 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
17280 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
17290 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
172a0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
172b0 6f 6e 6c 79 28 73 71 6c 69 74 65 33 42 74 72 65  only(sqlite3Btre
172c0 65 50 61 67 65 72 28 70 42 74 29 29 20 3a 20 2d  ePager(pBt)) : -
172d0 31 3b 0a 7d 0a                                   1;.}.