/ Hex Artifact Content
Login

Artifact 57b7ebf64804621a3d783a359d8a4c6a4d256573:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1110: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1120: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1130: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
1140: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1150: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1160: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1170: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20  .  /* If SQLite 
1180: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c  is already compl
1190: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
11a0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  d, then this cal
11b0: 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  l.  ** to sqlite
11c0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73  3_initialize() s
11d0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70  hould be a no-op
11e0: 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74 69  .  But the initi
11f0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d  alization.  ** m
1200: 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e  ust be complete.
1210: 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74    So isInit must
1220: 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69   not be set unti
1230: 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20  l the very end. 
1240: 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74   ** of this rout
1250: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
1260: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1270: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
1280: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1290: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
12a0: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
12b0: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
12c0: 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  d.  If unable to
12d0: 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a   .  ** initializ
12e0: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
12f0: 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61  ystem, return ea
1300: 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72 72  rly with the err
1310: 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  or..  ** If the 
1320: 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63  system is so sic
1330: 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75 6e  k that we are un
1340: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
1350: 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74   a mutex,.  ** t
1360: 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68  here is not much
1370: 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67   SQLite is going
1380: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64   to be able to d
1390: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
13a0: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
13b0: 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65 20   must take care 
13c0: 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69  of serializing i
13d0: 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74  ts own.  ** init
13e0: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
13f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d  .  rc = sqlite3M
1400: 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66  utexInit();.  if
1410: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1420: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1430: 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20  ze the malloc() 
1440: 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72  system and the r
1450: 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75  ecursive pInitMu
1460: 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20  tex mutex..  ** 
1470: 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  This operation i
1480: 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  s protected by t
1490: 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52  he STATIC_MASTER
14a0: 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68   mutex.  Note th
14b0: 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c  at.  ** MutexAll
14c0: 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  oc() is called f
14d0: 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74 65  or a static mute
14e0: 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69  x prior to initi
14f0: 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a  alizing the.  **
1500: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1510: 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73  m - this implies
1520: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
1530: 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63  tion of a static
1540: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74  .  ** mutex must
1550: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75 70   not require sup
1560: 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61  port from the ma
1570: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a  lloc subsystem..
1580: 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47    */.  MUTEX_LOG
1590: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
15a0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15b0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15c0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
15d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15e0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
15f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1600: 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74  nfig.isMutexInit
1610: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c   = 1;.  if( !sql
1620: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1630: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
1640: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1650: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20  3MallocInit();. 
1660: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1670: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1680: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1690: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
16a0: 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   1;.    if( !sql
16b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16c0: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
16d0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
16e0: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
16f0: 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tex =.          
1700: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1710: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1720: 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
1730: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1740: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
1750: 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65 33  utex && !sqlite3
1760: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1770: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
1780: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1790: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
17a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
17b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
17d0: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
17e0: 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  utex++;.  }.  sq
17f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1800: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
1810: 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53  * If rc is not S
1820: 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73  QLITE_OK at this
1830: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74   point, then eit
1840: 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20  her the malloc. 
1850: 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f   ** subsystem co
1860: 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69  uld not be initi
1870: 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79  alized or the sy
1880: 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61  stem failed to a
1890: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65  llocate.  ** the
18a0: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
18b0: 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  x. Return an err
18c0: 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  or in either cas
18d0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  e.  */.  if( rc!
18e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1900: 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65  ..  /* Do the re
1910: 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  st of the initia
1920: 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74  lization under t
1930: 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  he recursive mut
1940: 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ex so.  ** that 
1950: 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  we will be able 
1960: 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73  to handle recurs
1970: 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20  ive calls into. 
1980: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   ** sqlite3_init
1990: 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72  ialize().  The r
19a0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e  ecursive calls n
19b0: 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72  ormally come thr
19c0: 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ough.  ** sqlite
19d0: 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e  3_os_init() when
19e0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69   it invokes sqli
19f0: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1a00: 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20  (), but other.  
1a10: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  ** recursive cal
1a20: 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  ls might also be
1a30: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a   possible..  **.
1a40: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
1a50: 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d  ION-OF: R-00140-
1a60: 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75 74  37445 SQLite aut
1a70: 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61  omatically seria
1a80: 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a  lizes calls.  **
1a90: 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65   to the xInit me
1aa0: 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e  thod, so the xIn
1ab0: 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e  it method need n
1ac0: 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66 65  ot be threadsafe
1ad0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1ae0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20  following mutex 
1af0: 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a  is what serializ
1b00: 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  es access to the
1b10: 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20 78   appdef pcache x
1b20: 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64  Init.  ** method
1b30: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
1b40: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78  pcache_methods.x
1b50: 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d  Init() all is em
1b60: 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20  bedded in the.  
1b70: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
1b80: 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69  e3PcacheInitiali
1b90: 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ze()..  */.  sql
1ba0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1bb0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1bc0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1bd0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
1be0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1bf0: 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  it==0 && sqlite3
1c00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1c10: 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20  rogress==0 ){.  
1c20: 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70    FuncDefHash *p
1c30: 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46  Hash = &GLOBAL(F
1c40: 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69  uncDefHash, sqli
1c50: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1c60: 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ns);.    sqlite3
1c70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1c80: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
1c90: 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30   memset(pHash, 0
1ca0: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
1cb0: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29  GlobalFunctions)
1cc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1cd0: 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63  gisterGlobalFunc
1ce0: 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28  tions();.    if(
1cf0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d00: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
1d10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
1d20: 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1d30: 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  Initialize();.  
1d40: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1d50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1d70: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1d80: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  nit = 1;.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69  c = sqlite3OsIni
1da0: 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t();.    }.    i
1db0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1dd0: 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65 74  3PCacheBufferSet
1de0: 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  up( sqlite3Globa
1df0: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a  lConfig.pPage, .
1e00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
1e20: 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Page, sqlite3Glo
1e30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29  balConfig.nPage)
1e40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1e50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1e60: 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
1e70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1e80: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1e90: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1ea0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1eb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ec0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
1ed0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
1ee0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
1ef0: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
1f00: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
1f10: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
1f20: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
1f30: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
1f40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f50: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1f60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f70: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1f80: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
1f90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1fa0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
1fb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
1fc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fd0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
1fe0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1ff0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2000: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2010: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2020: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2030: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2040: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2050: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2060: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2070: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2080: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
2090: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
20a0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
20b0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
20c0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
20d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
20e0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
20f0: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2100: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2110: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2120: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2130: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2140: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2150: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2160: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2170: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2180: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
2190: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
21a0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
21b0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
21c0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
21d0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
21e0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
21f0: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2200: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2210: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2220: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2240: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2250: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2260: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2270: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2280: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
2290: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
22a0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
22b0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
22c0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
22d0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
22e0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
22f0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2300: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2310: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2320: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2330: 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d 3d 53  INIT.  if( rc==S
2340: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
2350: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2360: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e  isInit ){.    in
2370: 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  t SQLITE_EXTRA_I
2380: 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  NIT(const char*)
2390: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
23a0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b  E_EXTRA_INIT(0);
23b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23d0: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65  ** Undo the effe
23e0: 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  cts of sqlite3_i
23f0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75  nitialize().  Mu
2400: 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  st not be called
2410: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20   while.** there 
2420: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
2430: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2440: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2450: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a  llocations or.**
2460: 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20   while any part 
2470: 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68  of SQLite is oth
2480: 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e  erwise in use in
2490: 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68   any thread.  Th
24a0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
24b0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
24c0: 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65    But it is safe
24d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20   to invoke this 
24e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68  routine.** on wh
24f0: 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  en SQLite is alr
2500: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20  eady shut down. 
2510: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
2520: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a  ready shut down.
2530: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2540: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tine is invoked,
2550: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2560: 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
2570: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
2580: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
2590: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c  void){.  if( sql
25a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
25b0: 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65  .isInit ){.#ifde
25c0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53  f SQLITE_EXTRA_S
25d0: 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64  HUTDOWN.    void
25e0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
25f0: 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20  UTDOWN(void);.  
2600: 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53    SQLITE_EXTRA_S
2610: 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69  HUTDOWN();.#endi
2620: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73  f.    sqlite3_os
2630: 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  _end();.    sqli
2640: 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65  te3_reset_auto_e
2650: 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20  xtension();.    
2660: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2670: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
2680: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
2690: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
26a0: 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20  PCacheInit ){.  
26b0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
26c0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73  hutdown();.    s
26d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
26e0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
26f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2700: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2710: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2720: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
2730: 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73  llocEnd();.    s
2740: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2750: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2760: 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2770: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f  LITE_OMIT_SHUTDO
2780: 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20  WN_DIRECTORIES. 
2790: 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73     /* The heap s
27a0: 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77  ubsystem has now
27b0: 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61   been shutdown a
27c0: 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  nd these values 
27d0: 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20  are supposed.   
27e0: 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f   ** to be NULL o
27f0: 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72  r point to memor
2800: 79 20 74 68 61 74 20 77 61 73 20 6f 62 74 61 69  y that was obtai
2810: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2820: 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a  _malloc(),.    *
2830: 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65  * which would re
2840: 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20  ly on that heap 
2850: 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65  subsystem; there
2860: 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  fore, make sure 
2870: 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c  these.    ** val
2880: 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72  ues cannot refer
2890: 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20   to heap memory 
28a0: 74 68 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e  that was just in
28b0: 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74  validated when t
28c0: 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73  he.    ** heap s
28d0: 75 62 73 79 73 74 65 6d 20 77 61 73 20 73 68 75  ubsystem was shu
28e0: 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20  tdown.  This is 
28f0: 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65  only done if the
2900: 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f   current call to
2910: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
2920: 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69  ction resulted i
2930: 6e 20 74 68 65 20 68 65 61 70 20 73 75 62 73 79  n the heap subsy
2940: 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65  stem actually be
2950: 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20  ing shutdown..  
2960: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2970: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2980: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2990: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
29a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
29b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
29c0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
29d0: 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  xInit ){.    sql
29e0: 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a  ite3MutexEnd();.
29f0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2a00: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2a10: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nit = 0;.  }..  
2a20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a40: 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69  API allows appli
2a50: 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66  cations to modif
2a60: 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e  y the global con
2a70: 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a  figuration of.**
2a80: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
2a90: 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ary at run-time.
2aa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ab0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2ac0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
2ad0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
2ae0: 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62  tanding.** datab
2af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
2b00: 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  or memory alloca
2b10: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75  tions.  This rou
2b20: 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74  tine is not.** t
2b30: 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c  hreadsafe.  Fail
2b40: 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65 73  ure to heed thes
2b50: 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c  e warnings can l
2b60: 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74  ead to unpredict
2b70: 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72  able.** behavior
2b80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b90: 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20  _config(int op, 
2ba0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2bb0: 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ap;.  int rc = S
2bc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2bd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
2be0: 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51   shall return SQ
2bf0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69  LITE_MISUSE if i
2c00: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69  t is invoked whi
2c10: 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69  le.  ** the SQLi
2c20: 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e  te library is in
2c30: 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73   use. */.  if( s
2c40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c50: 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75  ig.isInit ) retu
2c60: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
2c70: 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61  _BKPT;..  va_sta
2c80: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
2c90: 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
2ca0: 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67   /* Mutex config
2cb0: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
2cc0: 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  are only availab
2cd0: 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73 61  le in a threadsa
2ce0: 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  fe.    ** compil
2cf0: 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64  e. .    */.#if d
2d00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
2d10: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
2d20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
2d30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d40: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
2d50: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2d60: 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74   Disable all mut
2d70: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
2d80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2d90: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
2da0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
2db0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
2dc0: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  llMutex = 0;.   
2dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2df0: 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45  CONFIG_MULTITHRE
2e00: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e10: 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  isable mutexing 
2e20: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  of database conn
2e30: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  ections */.     
2e40: 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78   /* Enable mutex
2e50: 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61  ing of core data
2e60: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
2e70: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e80: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
2e90: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  tex = 1;.      s
2ea0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2eb0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
2ec0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2ed0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2ee0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52  QLITE_CONFIG_SER
2ef0: 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  IALIZED: {.     
2f00: 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d   /* Enable all m
2f10: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2f20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f30: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f40: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f60: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20  FullMutex = 1;. 
2f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f80: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f90: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20  E_CONFIG_MUTEX: 
2fa0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2fb0: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2fc0: 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  e mutex implemen
2fd0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2fe0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ff0: 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f  fig.mutex = *va_
3000: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3010: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b  mutex_methods*);
3020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3030: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3040: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55  ITE_CONFIG_GETMU
3050: 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TEX: {.      /* 
3060: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
3070: 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65  rent mutex imple
3080: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
3090: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
30a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
30b0: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
30c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
30d0: 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ex;.      break;
30e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .    }.#endif...
30f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3100: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b  CONFIG_MALLOC: {
3110: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
3120: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
3130: 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e   malloc implemen
3140: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3150: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3160: 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28  fig.m = *va_arg(
3170: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
3180: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
3190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
31b0: 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20  NFIG_GETMALLOC: 
31c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69  {.      /* Retri
31d0: 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  eve the current 
31e0: 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65  malloc() impleme
31f0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3200: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3210: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
3220: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
3230: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
3240: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3250: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3260: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
3270: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
3280: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3290: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
32a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
32b0: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
32c0: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
32d0: 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74  le the malloc st
32e0: 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  atus collection 
32f0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3300: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3310: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3320: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3340: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3350: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3360: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3370: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63   a buffer for sc
3380: 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61  ratch memory spa
3390: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
33a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
33b0: 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  pScratch = va_ar
33c0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
33d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
33e0: 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63  lConfig.szScratc
33f0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3400: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3410: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3420: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
3430: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3460: 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20  NFIG_PAGECACHE: 
3470: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67  {.      /* Desig
3480: 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f  nate a buffer fo
3490: 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d  r page cache mem
34a0: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
34b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
34c0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
34d0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
34e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
34f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
3500: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
3510: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
3520: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3530: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
3540: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3560: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3570: 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20  FIG_PCACHE: {.  
3580: 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
3590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
35b0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
35c0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
35d0: 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  now an error */.
35e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3600: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3610: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3620: 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20  FIG_PCACHE2: {. 
3630: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3640: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
3650: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
3660: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3670: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3680: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20  onfig.pcache2 = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
36b0: 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ds2*);.      bre
36c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
36d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
36e0: 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20  _GETPCACHE2: {. 
36f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3700: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
3710: 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b  che2.xInit==0 ){
3720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3730: 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c 74  PCacheSetDefault
3740: 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
3750: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
3760: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3770: 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65  hods2*) = sqlite
3780: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
3790: 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65  ache2;.      bre
37a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
37b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
37c0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
37d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
37e0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
37f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3800: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
3810: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
3820: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 68  e a buffer for h
3830: 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  eap memory space
3840: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3850: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
3860: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3870: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3880: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3890: 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.nHeap = va_ar
38a0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
38b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
38c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61  onfig.mnReq = va
38d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a  _arg(ap, int);..
38e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
38f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3900: 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20  Req<1 ){.       
3910: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3920: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a  nfig.mnReq = 1;.
3930: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3940: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3950: 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32  fig.mnReq>(1<<12
3960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
3970: 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20  cap min request 
3980: 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a  size at 2^12 */.
3990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
39a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
39b0: 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20  q = (1<<12);.   
39c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
39d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39e0: 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a  fig.pHeap==0 ){.
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
3a00: 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69  e heap pointer i
3a10: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73  s NULL, then res
3a20: 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  tore the malloc 
3a30: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
3a40: 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74         ** back t
3a50: 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
3a60: 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  too.  This will 
3a70: 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63  cause the malloc
3a80: 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a   to go.        *
3a90: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65  * back to its de
3aa0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
3ab0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
3ac0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
3ad0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e  s.        ** run
3ae0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
3af0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c       memset(&sql
3b00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b10: 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  .m, 0, sizeof(sq
3b20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3b30: 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g.m));.      }el
3b40: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
3b50: 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20  he heap pointer 
3b60: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
3b70: 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66  n install one of
3b80: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
3b90: 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65  mem5.c/mem3.c me
3ba0: 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65  thods. If neithe
3bb0: 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  r ENABLE_MEMSYS3
3bc0: 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   nor.        ** 
3bd0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69  ENABLE_MEMSYS5 i
3be0: 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72  s defined, retur
3bf0: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
3c00: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
3c10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
3c20: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
3c30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c40: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
3c50: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
3c60: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
3c70: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3c80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3c90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
3ca0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
3cb0: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
3cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3cd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3ce0: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
3cf0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
3d00: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
3d10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3d20: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
3d30: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3d50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
3d60: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
3d70: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d90: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
3da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3db0: 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69 6f 6e  logger funcction
3dc0: 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61   and its first a
3dd0: 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20  rgument..    ** 
3de0: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e  The default is N
3df0: 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73  ULL.  Logging is
3e00: 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65   disabled if the
3e10: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
3e20: 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  r is.    ** NULL
3e30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3e40: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3e50: 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOG: {.      /* 
3e60: 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
3e70: 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
3e80: 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
3e90: 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
3ea0: 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
3eb0: 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
3ec0: 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
3ed0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3ee0: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
3ef0: 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a  p, void(*)(void*
3f00: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
3f10: 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
3f20: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
3f30: 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64  *LOGFUNC_t)(void
3f40: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
3f50: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
3f70: 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
3f80: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
3f90: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3fa0: 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20  onfig.pLogArg = 
3fb0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
3fc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
3fe0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
3ff0: 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  I: {.      sqlit
4000: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
4010: 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67  OpenUri = va_arg
4020: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4040: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4050: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4060: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4070: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4080: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
4090: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
40a0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
40b0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
40c0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
40d0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
40e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
40f0: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
4100: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
4110: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
4120: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4130: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
4140: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
4150: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4160: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
4170: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
4180: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
4190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
41a0: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
41b0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
41c0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
41d0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
41e0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
41f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4200: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
4210: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4220: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
4230: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
4240: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
4250: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4260: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4270: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
4280: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4290: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
42a0: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
42b0: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
42c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
42d0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
42e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
42f0: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
4300: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
4310: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
4320: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
4330: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
4340: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
4350: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
4360: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
4370: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
4380: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
4390: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
43a0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
43b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
43c0: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
43d0: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
43e0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
43f0: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
4400: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
4410: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
4420: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
4430: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
4440: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
4450: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
4460: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
4470: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
4480: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
4490: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
44a0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
44b0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
44c0: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
44d0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
44e0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
44f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
4500: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
4510: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4520: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4530: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
4540: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
4550: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
4560: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
4570: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
4580: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
4590: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
45a0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
45b0: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
45c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
45d0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
45e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
45f0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
4600: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4610: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4620: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4630: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4640: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4650: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4660: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4670: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4680: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4690: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
46a0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
46b0: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
46c0: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
46d0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
46e0: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
46f0: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
4700: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4710: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4720: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4730: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4740: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4750: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4760: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4770: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4780: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4790: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
47a0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
47b0: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
47c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
47d0: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  End = 0;.    db-
47e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
47f0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
4800: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4810: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4840: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4850: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4860: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4870: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4880: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4890: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
48a0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
48b0: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
48c0: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
48d0: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
48e0: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
48f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
4900: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
4910: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
4920: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
4930: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4940: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4950: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4970: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4980: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4990: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
49a0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
49b0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
49c0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
49d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
49e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
49f0: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
4a00: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
4a10: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4a20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
4a30: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
4a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4a50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4a60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4a70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4a80: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4a90: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4aa0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4ab0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4ac0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4ad0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
4ae0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
4af0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
4b00: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
4b10: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
4b20: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
4b30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
4b40: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
4b50: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
4b60: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
4b70: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
4b80: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
4b90: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
4ba0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4bb0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
4bc0: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
4bd0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
4be0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4bf0: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
4c00: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
4c10: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
4c20: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
4c30: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
4c40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4c50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4c60: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
4c70: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
4c80: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
4c90: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
4ca0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
4cb0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
4cc0: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
4cd0: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
4ce0: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
4cf0: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
4d00: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
4d10: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
4d20: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
4d30: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
4d40: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
4d50: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
4d60: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
4d70: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
4d80: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
4d90: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
4da0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
4db0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
4dc0: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
4dd0: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
4de0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
4df0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
4e00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
4e10: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
4e30: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
4e40: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4e50: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
4e60: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
4e70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
4e80: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
4e90: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
4ea0: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4ec0: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
4ed0: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
4ee0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
4ef0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
4f00: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
4f10: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
4f20: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
4f30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
4f40: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
4f50: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
4f60: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
4f70: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
4f80: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
4f90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4fa0: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
4fb0: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
4fc0: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
4fd0: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
4fe0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ff0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5000: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
5010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5040: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5060: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5070: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
5080: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
5090: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
50a0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
50b0: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
50c0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
50d0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
50e0: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
50f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
5100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5110: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
5120: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
5130: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
5140: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
5150: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
5160: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
5170: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
5180: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
5190: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
51a0: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
51b0: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
51c0: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
51d0: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
51e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
51f0: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
5200: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
5210: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
5220: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
5230: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
5240: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5250: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
5260: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
5270: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
5280: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
5290: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
52a0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
52b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
52c0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
52d0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
52e0: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
52f0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
5300: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
5310: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
5320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
5330: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
5340: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
5350: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
5360: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
5370: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5380: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
5390: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
53a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
53b0: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
53c0: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
53d0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
53e0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
53f0: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
5400: 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndant.** compari
5410: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
5420: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
5430: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
5440: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
5450: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
5460: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
5470: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
5480: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
5490: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
54a0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
54b0: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
54c0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
54d0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
54e0: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
54f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5500: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
5510: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
5520: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
5530: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
5540: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
5550: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
5560: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
5570: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
5580: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
5590: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
55a0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
55b0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
55c0: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
55d0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
55e0: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
55f0: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
5600: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
5610: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
5620: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
5630: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
5640: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
5650: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
5660: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5670: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
5680: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5690: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
56a0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
56b0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
56c0: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
56d0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
56e0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
56f0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
5700: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5710: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5720: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
5730: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5740: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5750: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5760: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5770: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5780: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5790: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
57a0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
57b0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
57c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
57d0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
57e0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
57f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
5800: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
5810: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
5820: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
5830: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5840: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5850: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5860: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5870: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5880: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5890: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
58a0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
58b0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
58c0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
58d0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
58e0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
58f0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
5900: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
5910: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
5920: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
5930: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5940: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5950: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5960: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5970: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5980: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5990: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
59a0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
59b0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
59c0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
59d0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
59e0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
59f0: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
5a00: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
5a10: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
5a20: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
5a30: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5a40: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5a50: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5a60: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5a70: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5a80: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5a90: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5aa0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5ab0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5ac0: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5ad0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
5ae0: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
5af0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
5b00: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
5b10: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
5b20: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
5b30: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
5b40: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
5b50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5b60: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
5b70: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
5b80: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
5b90: 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65   existing SQLite
5ba0: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74   database.*/.int
5bb0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
5bc0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
5bd0: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5bf0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
5c00: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
5c10: 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  ;..  if( !db ){.
5c20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5c30: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
5c40: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
5c50: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
5c60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5c70: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
5c80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5c90: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
5ca0: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f  mutex);..  /* Fo
5cb0: 72 63 65 20 78 44 65 73 74 72 6f 79 20 63 61 6c  rce xDestroy cal
5cc0: 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61  ls on all virtua
5cd0: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73 71  l tables */.  sq
5ce0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
5cf0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29  alSchema(db, -1)
5d00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  ;..  /* If a tra
5d10: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
5d20: 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74 65 72  , the ResetInter
5d30: 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c  nalSchema() call
5d40: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
5d50: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
5d60: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
5d70: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
5d80: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
5d90: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
5da0: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
5db0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
5dc0: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
5dd0: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
5de0: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
5df0: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
5e00: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
5e10: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
5e20: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
5e30: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
5e40: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
5e50: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
5e60: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
5e70: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
5e80: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
5e90: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
5ea0: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
5eb0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
5ec0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56  ny outstanding V
5ed0: 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Ms, return SQLIT
5ee0: 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28  E_BUSY. */.  if(
5ef0: 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20   db->pVdbe ){.  
5f00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
5f10: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
5f20: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
5f30: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
5f40: 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61   unfinalised sta
5f50: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 73  tements");.    s
5f60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5f70: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
5f80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5f90: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73  _BUSY;.  }.  ass
5fa0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 61 66 65  ert( sqlite3Safe
5fb0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
5fc0: 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d  db) );..  for(j=
5fd0: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
5fe0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
5ff0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  Bt = db->aDb[j].
6000: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
6010: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
6020: 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20  IsInBackup(pBt) 
6030: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6040: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
6050: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
6060: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f    "unable to clo
6070: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 69  se due to unfini
6080: 73 68 65 64 20 62 61 63 6b 75 70 20 6f 70 65 72  shed backup oper
6090: 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73  ation");.      s
60a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
60b0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
60c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
60d0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
60e0: 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
60f0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61  y outstanding Sa
6100: 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
6110: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
6120: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
6130: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  db);..  for(j=0;
6140: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
6150: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
6160: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
6170: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
6180: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
6190: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
61a0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
61b0: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
61c0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
61d0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
61e0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
61f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
6200: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
6210: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31  nalSchema(db, -1
6220: 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68  );..  /* Tell th
6230: 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79  e code in notify
6240: 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e  .c that the conn
6250: 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72  ection no longer
6260: 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20   holds any.  ** 
6270: 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e  locks and does n
6280: 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66  ot require any f
6290: 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f  urther unlock-no
62a0: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
62b0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
62c0: 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64  nnectionClosed(d
62d0: 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  b);..  assert( d
62e0: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
62f0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
6300: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
6310: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72  .  for(j=0; j<Ar
6320: 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e  raySize(db->aFun
6330: 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  c.a); j++){.    
6340: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
6350: 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20  *pHash, *p;.    
6360: 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e  for(p=db->aFunc.
6370: 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68  a[j]; p; p=pHash
6380: 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d  ){.      pHash =
6390: 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20   p->pHash;.     
63a0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
63b0: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
63c0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
63d0: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
63e0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
63f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6400: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d   p);.        p =
6410: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a   pNext;.      }.
6420: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
6430: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
6440: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
6450: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
6460: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
6470: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
6480: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
6490: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
64a0: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
64b0: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
64c0: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
64d0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
64e0: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
64f0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
6500: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
6510: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
6520: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
6530: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
6540: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
6550: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
6560: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
6570: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
6580: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
6590: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
65a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
65b0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
65c0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
65d0: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
65e0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
65f0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
6600: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
6610: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
6620: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
6630: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
6640: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
6650: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
6660: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
6670: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6680: 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73  , pMod);.  }.  s
6690: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
66a0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
66b0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
66c0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
66d0: 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c  _OK, 0); /* Deal
66e0: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
66f0: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
6700: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70  . */.  if( db->p
6710: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
6720: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
6730: 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pErr);.  }.  sql
6740: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
6750: 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e  ons(db);..  db->
6760: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
6770: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  AGIC_ERROR;..  /
6780: 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62  * The temp-datab
6790: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c  ase schema is al
67a0: 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e  located differen
67b0: 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  tly from the oth
67c0: 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f  er schema.  ** o
67d0: 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71  bjects (using sq
67e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72  liteMalloc() dir
67f0: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
6800: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  f sqlite3BtreeSc
6810: 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f  hema())..  ** So
6820: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
6830: 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f  freed here. Todo
6840: 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74  : Why not roll t
6850: 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69  he temp schema i
6860: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  nto.  ** the sam
6870: 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  e sqliteMalloc()
6880: 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74   as the one that
6890: 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64   allocates the d
68a0: 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74  atabase .  ** st
68b0: 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20  ructure?.  */.  
68c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
68d0: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  , db->aDb[1].pSc
68e0: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
68f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
6900: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d  >mutex);.  db->m
6910: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
6920: 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71  GIC_CLOSED;.  sq
6930: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
6940: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
6950: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
6960: 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20  side.nOut==0 ); 
6970: 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c   /* Fails on a l
6980: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
6990: 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  leak */.  if( db
69a0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
69b0: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
69c0: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
69d0: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
69e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
69f0: 72 65 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  ree(db);.  retur
6a00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6a10: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
6a20: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
6a30: 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20  s.  If tripCode 
6a40: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
6a50: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70  , then.** any op
6a60: 65 6e 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  en cursors are i
6a70: 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69  nvalidated ("tri
6a80: 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74  pped" - as in "t
6a90: 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69  ripping a circui
6aa0: 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61  t.** breaker") a
6ab0: 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72  nd made to retur
6ac0: 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68  n tripCode if th
6ad0: 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74  ere are any furt
6ae0: 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  her.** attempts 
6af0: 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73  to use that curs
6b00: 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
6b10: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
6b20: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
6b30: 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
6b40: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
6b50: 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  s = 0;.  assert(
6b60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6b70: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
6b80: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
6b90: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
6ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6bb0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
6bc0: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
6bd0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
6be0: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66  f( p ){.      if
6bf0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
6c00: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
6c10: 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20        inTrans = 
6c20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
6c30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
6c40: 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64  lback(p, tripCod
6c50: 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  e);.      db->aD
6c60: 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30  b[i].inTrans = 0
6c70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
6c80: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
6c90: 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  k(db);.  sqlite3
6ca0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
6cb0: 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  );..  if( db->fl
6cc0: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
6cd0: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
6ce0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
6cf0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
6d00: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
6d10: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
6d20: 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 7d  ema(db, -1);.  }
6d30: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
6d40: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
6d50: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
6d60: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
6d70: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
6d80: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20  rredCons = 0;.. 
6d90: 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62   /* If one has b
6da0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
6db0: 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62  invoke the rollb
6dc0: 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ack-hook callbac
6dd0: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78  k */.  if( db->x
6de0: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
6df0: 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20   && (inTrans || 
6e00: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29  !db->autoCommit)
6e10: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c   ){.    db->xRol
6e20: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62  lbackCallback(db
6e30: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b  ->pRollbackArg);
6e40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6e50: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
6e60: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
6e70: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
6e80: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
6e90: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
6ea0: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
6eb0: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
6ec0: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
6ed0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
6ee0: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
6ef0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
6f00: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
6f10: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
6f20: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
6f30: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
6f40: 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69  ogic error or mi
6f50: 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c  ssing database",
6f60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
6f70: 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c  NTERNAL    */ 0,
6f80: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
6f90: 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61  ERM        */ "a
6fa0: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
6fb0: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
6fc0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20   SQLITE_ABORT   
6fd0: 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b      */ "callback
6fe0: 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79   requested query
6ff0: 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20   abort",.    /* 
7000: 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20  SQLITE_BUSY     
7010: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
7020: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
7030: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  /* SQLITE_LOCKED
7040: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
7050: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
7060: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7070: 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a  TE_NOMEM       *
7080: 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  / "out of memory
7090: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
70a0: 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20  _READONLY    */ 
70b0: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
70c0: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
70d0: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
70e0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
70f0: 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65    */ "interrupte
7100: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
7110: 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f  E_IOERR       */
7120: 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   "disk I/O error
7130: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7140: 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20  _CORRUPT     */ 
7150: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
7160: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
7170: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
7180: 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f  E_NOTFOUND    */
7190: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
71a0: 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ion",.    /* SQL
71b0: 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ITE_FULL        
71c0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20  */ "database or 
71d0: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20  disk is full",. 
71e0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e     /* SQLITE_CAN
71f0: 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61  TOPEN    */ "una
7200: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
7210: 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20  base file",.    
7220: 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  /* SQLITE_PROTOC
7230: 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e  OL    */ "lockin
7240: 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20  g protocol",.   
7250: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
7260: 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65         */ "table
7270: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
7280: 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  a",.    /* SQLIT
7290: 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f  E_SCHEMA      */
72a0: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
72b0: 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a  a has changed",.
72c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f      /* SQLITE_TO
72d0: 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74  OBIG      */ "st
72e0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f  ring or blob too
72f0: 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51   big",.    /* SQ
7300: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
7310: 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20   */ "constraint 
7320: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  failed",.    /* 
7330: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
7340: 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20     */ "datatype 
7350: 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f  mismatch",.    /
7360: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
7370: 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79       */ "library
7380: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
7390: 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22  out of sequence"
73a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
73b0: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
73c0: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
73d0: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
73e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
73f0: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
7400: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
7410: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
7420: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
7430: 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61  */ "auxiliary da
7440: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
7450: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
7460: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
7470: 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75  */ "bind or colu
7480: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
7490: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
74a0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
74b0: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e    */ "file is en
74c0: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
74d0: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
74e0: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
74f0: 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77   *zErr = "unknow
7500: 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74  n error";.  swit
7510: 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
7520: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
7530: 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20  ROLLBACK: {.    
7540: 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20    zErr = "abort 
7550: 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22  due to ROLLBACK"
7560: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7570: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
7580: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20  : {.      rc &= 
7590: 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  0xff;.      if( 
75a0: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
75b0: 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d   rc<ArraySize(aM
75c0: 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  sg) && aMsg[rc]!
75d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
75e0: 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  rr = aMsg[rc];. 
75f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7600: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7610: 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a  return zErr;.}..
7620: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7630: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ne implements a 
7640: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68  busy callback th
7650: 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72  at sleeps and tr
7660: 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74  ies.** again unt
7670: 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c  il a timeout val
7680: 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  ue is reached.  
7690: 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  The timeout valu
76a0: 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  e is.** an integ
76b0: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  er number of mil
76c0: 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64  liseconds passed
76d0: 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74   in as the first
76e0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
76f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
7700: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
7710: 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74  lback(. void *pt
7720: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
7730: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
7740: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20  nection */. int 
7750: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20  count           
7760: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7770: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
7780: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29  s been busy */.)
7790: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
77a0: 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28  WIN || (defined(
77b0: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
77c0: 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73  HAVE_USLEEP).  s
77d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64  tatic const u8 d
77e0: 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  elays[] =.     {
77f0: 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35   1, 2, 5, 10, 15
7800: 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32  , 20, 25, 25,  2
7810: 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30  5,  50,  50, 100
7820: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
7830: 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d  st u8 totals[] =
7840: 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c  .     { 0, 1, 3,
7850: 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c    8, 18, 33, 53,
7860: 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31   78, 103, 128, 1
7870: 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66  78, 228 };.# def
7880: 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79  ine NDELAY Array
7890: 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73  Size(delays).  s
78a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
78b0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
78c0: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d  nt timeout = db-
78d0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
78e0: 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72  int delay, prior
78f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  ;..  assert( cou
7900: 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63  nt>=0 );.  if( c
7910: 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b  ount < NDELAY ){
7920: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
7930: 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20  ays[count];.    
7940: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63  prior = totals[c
7950: 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ount];.  }else{.
7960: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
7970: 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20  ys[NDELAY-1];.  
7980: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
7990: 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c  [NDELAY-1] + del
79a0: 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41  ay*(count-(NDELA
79b0: 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Y-1));.  }.  if(
79c0: 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e   prior + delay >
79d0: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
79e0: 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20  delay = timeout 
79f0: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
7a00: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
7a10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
7a20: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
7a30: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
7a40: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
7a50: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  lse.  sqlite3 *d
7a60: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
7a70: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
7a80: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
7a90: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
7aa0: 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b  t;.  if( (count+
7ab0: 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75  1)*1000 > timeou
7ac0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
7ad0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
7ae0: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
7af0: 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65  , 1000000);.  re
7b00: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
7b10: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
7b20: 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61  he given busy ha
7b30: 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ndler..**.** Thi
7b40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7b50: 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72  led when an oper
7b60: 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74  ation failed wit
7b70: 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20  h a lock..** If 
7b80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7b90: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
7ba0: 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69  he lock is retri
7bb0: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65  ed.  If it.** re
7bc0: 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65  turns 0, the ope
7bd0: 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69  ration aborts wi
7be0: 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53  th an SQLITE_BUS
7bf0: 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  Y error..*/.int 
7c00: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
7c10: 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e  yHandler(BusyHan
7c20: 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  dler *p){.  int 
7c30: 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  rc;.  if( NEVER(
7c40: 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e  p==0) || p->xFun
7c50: 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79  c==0 || p->nBusy
7c60: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
7c70: 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70   rc = p->xFunc(p
7c80: 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  ->pArg, p->nBusy
7c90: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
7ca0: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d  {.    p->nBusy =
7cb0: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
7cc0: 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20    p->nBusy++;.  
7cd0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a  }.  return rc; .
7ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7cf0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62  utine sets the b
7d00: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  usy callback for
7d10: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
7d20: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
7d30: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
7d40: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
7d50: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  iven argument..*
7d60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
7d70: 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  sy_handler(.  sq
7d80: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
7d90: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
7da0: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
7db0: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
7dc0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7dd0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75  mutex);.  db->bu
7de0: 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20  syHandler.xFunc 
7df0: 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62  = xBusy;.  db->b
7e00: 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20  usyHandler.pArg 
7e10: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
7e20: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
7e30: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
7e40: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7e50: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
7e60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7e70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e80: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
7e90: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
7ea0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7eb0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
7ec0: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
7ed0: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
7ee0: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
7ef0: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
7f00: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
7f10: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
7f20: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
7f30: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
7f40: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
7f50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7f60: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
7f70: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
7f80: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
7f90: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
7fa0: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
7fb0: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c  d *pArg.){.  sql
7fc0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7fd0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
7fe0: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
7ff0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
8000: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
8010: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
8020: 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d   = nOps;.    db-
8030: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
8040: 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pArg;.  }else{. 
8050: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
8060: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50   = 0;.    db->nP
8070: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a  rogressOps = 0;.
8080: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
8090: 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sArg = 0;.  }.  
80a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
80b0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
80c0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
80d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   This routine in
80e0: 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74  stalls a default
80f0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68   busy handler th
8100: 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65  at waits for the
8110: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75  .** specified nu
8120: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
8130: 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75  onds before retu
8140: 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rning 0..*/.int 
8150: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
8160: 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eout(sqlite3 *db
8170: 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28  , int ms){.  if(
8180: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d   ms>0 ){.    db-
8190: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
81a0: 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  s;.    sqlite3_b
81b0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
81c0: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
81d0: 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  yCallback, (void
81e0: 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  *)db);.  }else{.
81f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
8200: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20  _handler(db, 0, 
8210: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
8220: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8230: 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70  *.** Cause any p
8240: 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ending operation
8250: 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20   to stop at its 
8260: 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75  earliest opportu
8270: 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nity..*/.void sq
8280: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
8290: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
82a0: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
82b0: 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  pted = 1;.}.../*
82c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
82d0: 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65  n is exactly the
82e0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
82f0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8300: 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  (), except.** th
8310: 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65  at it is designe
8320: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62  d to be called b
8330: 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e  y internal code.
8340: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
8350: 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  is.** that if a 
8360: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69  malloc() fails i
8370: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
8380: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20  _function(), an 
8390: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
83a0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
83b0: 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  e mallocFailed f
83c0: 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f  lag cleared. .*/
83d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61  .int sqlite3Crea
83e0: 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  teFunc(.  sqlite
83f0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
8400: 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  har *zFunctionNa
8410: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
8420: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
8430: 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20  d *pUserData,.  
8440: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
8450: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8460: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8470: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
8480: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
8490: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
84a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
84b0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
84c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
84d0: 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ,.  FuncDestruct
84e0: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a  or *pDestructor.
84f0: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
8500: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20  .  int nName;.. 
8510: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8520: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
8530: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8540: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
8550: 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63   ||.      (xFunc
8560: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
8570: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
8580: 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69   (!xFunc && (xFi
8590: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
85a0: 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  ||.      (!xFunc
85b0: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
85c0: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
85d0: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
85e0: 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  g>SQLITE_MAX_FUN
85f0: 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20  CTION_ARG) ||.  
8600: 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20      (255<(nName 
8610: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8620: 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  0( zFunctionName
8630: 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ))) ){.    retur
8640: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
8650: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66  BKPT;.  }.  .#if
8660: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8670: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
8680: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
8690: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
86a0: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
86b0: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
86c0: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
86d0: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
86e0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
86f0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
8700: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
8710: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
8720: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
8730: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
8740: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
8750: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
8760: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
8770: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
8780: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
8790: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
87a0: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
87b0: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
87c0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
87d0: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
87e0: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
87f0: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
8800: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
8810: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
8820: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
8830: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
8840: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
8850: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
8860: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
8870: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
8880: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8890: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
88a0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
88b0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
88c0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
88d0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20  LITE_UTF16LE,.  
88e0: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
88f0: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
8900: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
8910: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ctor);.    }.   
8920: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8930: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
8940: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
8950: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
8960: 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65  F16BE;.  }.#else
8970: 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  .  enc = SQLITE_
8980: 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a  UTF8;.#endif.  .
8990: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e    /* Check if an
89a0: 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69   existing functi
89b0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  on is being over
89c0: 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65  ridden or delete
89d0: 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61  d. If so,.  ** a
89e0: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
89f0: 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65  ive VMs, then re
8a00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8a10: 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a  . If a function.
8a20: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76    ** is being ov
8a30: 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64  erridden/deleted
8a40: 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e   but there are n
8a50: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c  o active VMs, al
8a60: 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  low the.  ** ope
8a70: 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e  ration to contin
8a80: 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74  ue but invalidat
8a90: 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65  e all precompile
8aa0: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
8ab0: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
8ac0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
8ad0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
8ae0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
8af0: 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  )enc, 0);.  if( 
8b00: 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63  p && p->iPrefEnc
8b10: 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67  ==enc && p->nArg
8b20: 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  ==nArg ){.    if
8b30: 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
8b40: 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Cnt ){.      sql
8b50: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
8b60: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
8b70: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
8b80: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
8b90: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
8ba0: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
8bb0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
8bc0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
8bd0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
8be0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
8bf0: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
8c00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
8c10: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
8c20: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ents(db);.    }.
8c30: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
8c40: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
8c50: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
8c60: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
8c70: 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73  u8)enc, 1);.  as
8c80: 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61  sert(p || db->ma
8c90: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69  llocFailed);.  i
8ca0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
8cb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8cc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
8cd0: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20  n older version 
8ce0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
8cf0: 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65  with a configure
8d00: 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  d destructor is.
8d10: 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61    ** being repla
8d20: 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  ced invoke the d
8d30: 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69  estructor functi
8d40: 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75  on here. */.  fu
8d50: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
8d60: 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65  , p);..  if( pDe
8d70: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
8d80: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
8d90: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44  f++;.  }.  p->pD
8da0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73  estructor = pDes
8db0: 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c  tructor;.  p->fl
8dc0: 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46  ags = 0;.  p->xF
8dd0: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
8de0: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
8df0: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
8e00: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
8e10: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
8e20: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
8e30: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
8e40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
8e60: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
8e70: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
8e80: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8e90: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
8ea0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
8eb0: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
8ec0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
8ed0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
8ee0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
8ef0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
8f00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8f10: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
8f20: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
8f30: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8f40: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
8f50: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
8f60: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
8f70: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8f80: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8f90: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
8fa0: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
8fb0: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
8ff0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
9000: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
9010: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
9020: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
9030: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
9040: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
9050: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
9060: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
9070: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
9080: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
9090: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
90a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
90b0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
90c0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
90d0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
90e0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
90f0: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
9100: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
9110: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
9120: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
9130: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71   *pArg = 0;.  sq
9140: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9150: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9160: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
9170: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
9180: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
9190: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
91a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
91b0: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
91c0: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
91d0: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
91e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
91f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
9200: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
9210: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
9220: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
9230: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
9240: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
9250: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
9260: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
9270: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67  ep, xFinal, pArg
9280: 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26  );.  if( pArg &&
9290: 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29   pArg->nRef==0 )
92a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
92b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
92c0: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
92d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
92e0: 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d  e(db, pArg);.  }
92f0: 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73  .. out:.  rc = s
9300: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
9310: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
9320: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9330: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
9340: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
9350: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
9360: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
9370: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
9380: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
9390: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
93a0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
93b0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
93c0: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
93d0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
93e0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
93f0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
9400: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
9410: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
9420: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
9430: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
9440: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
9450: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
9460: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
9470: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
9480: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
9490: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
94a0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
94b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
94c0: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
94d0: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
94e0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
94f0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
9500: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
9510: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
9520: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
9530: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
9540: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
9550: 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71   xFinal,0);.  sq
9560: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9570: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
9580: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
9590: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
95a0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
95b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
95c0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
95d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
95e0: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
95f0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
9600: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
9610: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
9620: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
9630: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
9640: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
9650: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
9660: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9670: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
9680: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
9690: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
96a0: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
96b0: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
96c0: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
96d0: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
96e0: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
96f0: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
9700: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
9710: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
9720: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
9730: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
9740: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
9750: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
9760: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
9770: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
9780: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
9790: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
97a0: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
97b0: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
97c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
97d0: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
97e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
97f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9800: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
9810: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
9820: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9830: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  Name);.  int rc 
9840: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
9850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9860: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9870: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
9880: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
9890: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
98a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
98b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
98c0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
98d0: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
98e0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
9910: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
9920: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
9930: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
9940: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
9950: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9960: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9970: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
9980: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9990: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
99a0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
99b0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
99c0: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
99d0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
99e0: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
99f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
9a00: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
9a10: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
9a20: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
9a30: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
9a40: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
9a50: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
9a60: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
9a70: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
9a80: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9a90: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
9aa0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
9ab0: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
9ac0: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
9ad0: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
9ae0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
9af0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
9b00: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
9b10: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
9b20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
9b30: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
9b40: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
9b50: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
9b60: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
9b70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9b80: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9b90: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
9ba0: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
9bb0: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
9bc0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
9bd0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
9be0: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
9bf0: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
9c00: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
9c10: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
9c20: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
9c30: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
9c40: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
9c50: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
9c60: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
9c70: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9c80: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
9c90: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
9ca0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
9cb0: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
9cc0: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
9cd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
9ce0: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
9cf0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
9d00: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
9d10: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
9d20: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
9d30: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
9d40: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
9d50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9d60: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9d70: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
9d80: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
9d90: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
9da0: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
9db0: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
9dc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9dd0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
9de0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
9df0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9e00: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
9e10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
9e20: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
9e30: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
9e40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
9e50: 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mits..** If the 
9e60: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
9e70: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
9e80: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
9e90: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
9ea0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
9eb0: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
9ec0: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
9ed0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9ee0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
9ef0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
9f00: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
9f10: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
9f20: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
9f30: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
9f40: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
9f50: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
9f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
9f70: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
9f80: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
9f90: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
9fa0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9fb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
9fc0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
9fd0: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
9fe0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
9ff0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
a000: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
a010: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a020: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
a030: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
a040: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
a050: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
a060: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
a070: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
a080: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
a090: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
a0a0: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
a0b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
a0c0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
a0d0: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
a0e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a0f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
a100: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
a110: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
a120: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
a130: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
a140: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
a150: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
a160: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
a170: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
a180: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
a190: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
a1a0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
a1b0: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
a1c0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
a1d0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
a1e0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
a1f0: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
a200: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
a210: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
a220: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
a230: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a240: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a250: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
a260: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
a270: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
a280: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
a290: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
a2a0: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
a2b0: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
a2c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
a2d0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
a2e0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
a2f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
a310: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
a320: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
a330: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
a340: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
a350: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
a360: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
a370: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
a380: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
a390: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
a3a0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
a3b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a3c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a3d0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
a3e0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
a3f0: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
a400: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
a410: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
a420: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
a430: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a440: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a450: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
a460: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a470: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
a480: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
a490: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
a4a0: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
a4b0: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
a4c0: 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
a4d0: 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
a4e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
a4f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
a500: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
a510: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
a520: 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
a530: 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
a540: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
a550: 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
a560: 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
a570: 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
a580: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
a590: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
a5a0: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
a5b0: 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
a5c0: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
a5d0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
a5e0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
a5f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
a600: 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
a610: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
a620: 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
a630: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
a640: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
a650: 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
a660: 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
a670: 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
a680: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
a690: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
a6a0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
a6b0: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
a6c0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
a6d0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
a6e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a6f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a700: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
a710: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
a720: 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
a730: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
a740: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
a750: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
a760: 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
a770: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
a780: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
a790: 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
a7a0: 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
a7b0: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
a7c0: 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
a7d0: 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
a7e0: 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
a7f0: 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
a800: 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
a810: 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
a820: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
a830: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
a840: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a850: 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
a860: 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
a870: 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
a880: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
a890: 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
a8a0: 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
a8b0: 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
a8c0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
a8d0: 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
a8e0: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
a8f0: 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
a900: 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
a910: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
a920: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
a930: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
a940: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
a950: 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
a960: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
a970: 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
a980: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
a990: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a9a0: 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
a9b0: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
a9c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
a9d0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
a9e0: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
a9f0: 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
aa00: 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
aa10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
aa20: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
aa30: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
aa40: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
aa50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
aa60: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
aa70: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
aa80: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
aa90: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
aaa0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
aab0: 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
aac0: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
aad0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
aae0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
aaf0: 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
ab00: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ab10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
ab20: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
ab30: 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
ab40: 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
ab50: 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
ab60: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
ab70: 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
ab80: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
aba0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
abb0: 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
abc0: 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
abd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
abe0: 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
abf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ac00: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
ac10: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
ac20: 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
ac30: 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
ac40: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
ac50: 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
ac60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ac70: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
ac80: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
ac90: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
aca0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
acb0: 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
acc0: 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
acd0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
ace0: 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
acf0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad10: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
ad20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ad30: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
ad40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
ad50: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
ad60: 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
ad70: 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
ada0: 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
adb0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
ade0: 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
adf0: 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
ae00: 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
ae10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
ae20: 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
ae30: 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
ae40: 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
ae50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ae60: 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
ae70: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
ae80: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
aeb0: 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
aec0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
aed0: 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
aee0: 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
aef0: 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
af00: 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  /..  /* Initiali
af10: 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
af20: 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
af30: 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
af40: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
af50: 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
af60: 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
af70: 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
af80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
af90: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
afa0: 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL>SQLITE_CHECK
afb0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b  POINT_PASSIVE );
afc0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
afd0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
afe0: 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  L<SQLITE_CHECKPO
aff0: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20  INT_RESTART );. 
b000: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
b010: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
b020: 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45  VE+2==SQLITE_CHE
b030: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
b040: 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
b050: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
b060: 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
b070: 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
b080: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20  INT_RESTART ){. 
b090: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b0a0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
b0b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
b0c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
b0d0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
b0e0: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
b0f0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
b100: 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
b110: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
b120: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b130: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
b140: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
b150: 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
b160: 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
b170: 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
b180: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b190: 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
b1a0: 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
b1b0: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
b1c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
b1d0: 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72   rc, 0);.  }.  r
b1e0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
b1f0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
b200: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
b210: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
b220: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
b230: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
b240: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
b250: 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
b260: 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
b270: 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
b280: 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
b290: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
b2a0: 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
b2b0: 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
b2c0: 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
b2d0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
b2e0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
b2f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
b300: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
b310: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b320: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
b330: 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  v2(db, zDb, SQLI
b340: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
b350: 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a  SSIVE, 0, 0);.}.
b360: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b370: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52  OMIT_WAL./*.** R
b380: 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
b390: 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
b3a0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
b3b0: 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
b3c0: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
b3d0: 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
b3e0: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
b3f0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
b400: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
b410: 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63  abase being chec
b420: 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a  kpointed, this .
b430: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
b440: 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
b450: 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69  D and a checkpoi
b460: 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  nt is not attemp
b470: 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ted. If .** an e
b480: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
b490: 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68  e running the ch
b4a0: 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c  eckpoint, an SQL
b4b0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
b4c0: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28  s .** returned (
b4d0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
b4e0: 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  R). Otherwise, S
b4f0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
b500: 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  The mutex on dat
b510: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20  abase handle db 
b520: 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62  should be held b
b530: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
b540: 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63  e mutex.** assoc
b550: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
b560: 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62  pecific b-tree b
b570: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
b580: 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a  d is taken by.**
b590: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
b5a0: 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f  hile the checkpo
b5b0: 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  int is running..
b5c0: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20  **.** If iDb is 
b5d0: 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41  passed SQLITE_MA
b5e0: 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e  X_ATTACHED, then
b5f0: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
b600: 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63  tabases are.** c
b610: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20  heckpointed. If 
b620: 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
b630: 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65  untered it is re
b640: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
b650: 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d  ly -.** no attem
b660: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
b670: 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d  eckpoint any rem
b680: 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73  aining databases
b690: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
b6a0: 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f  r eMode is one o
b6b0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
b6c0: 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
b6d0: 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f  L or RESTART..*/
b6e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
b6f0: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
b700: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
b710: 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
b720: 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
b730: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b740: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
b750: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
b760: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
b790: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
b7a0: 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
b7b0: 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
b7c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b7d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
b7e0: 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
b7f0: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
b800: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
b810: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b820: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
b830: 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
b840: 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
b850: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
b860: 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
b870: 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
b880: 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
b890: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
b8a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
b8b0: 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
b8c0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
b8d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
b8e0: 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
b8f0: 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
b900: 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
b910: 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
b920: 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
b930: 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
b940: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b950: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
b960: 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
b970: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b980: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
b990: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b9a0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
b9b0: 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
b9c0: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
b9d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b9e0: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
b9f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ba00: 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
ba10: 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
ba20: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
ba30: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
ba40: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
ba50: 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
ba60: 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
ba70: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
ba80: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
ba90: 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
baa0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
bab0: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
bac0: 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
bad0: 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
bae0: 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
baf0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
bb00: 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
bb10: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
bb20: 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
bb30: 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
bb40: 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
bb50: 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
bb60: 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
bb70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
bb80: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
bb90: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
bba0: 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
bbb0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
bbc0: 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
bbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
bbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
bbf0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
bc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
bc10: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
bc20: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
bc40: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
bc50: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
bc90: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
bcc0: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
bcd0: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
bd00: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
bd10: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
bd20: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
bd30: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
bd40: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
bd50: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
bd60: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
bd70: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
bd90: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
bda0: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
bde0: 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
be10: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
be20: 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
be30: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
be40: 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
be50: 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
be60: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
be70: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
be80: 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
be90: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
bea0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
beb0: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
bec0: 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
bed0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
bee0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
bef0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
bf00: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
bf10: 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
bf20: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
bf30: 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  3.  return 0;.#e
bf40: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
bf50: 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
bf60: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
bf70: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
bf80: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
bf90: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
bfa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
bfb0: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
bfc0: 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
bfd0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
bfe0: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
bff0: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
c000: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
c010: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
c020: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
c030: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
c040: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
c050: 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
c060: 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  SE_BKPT);.  }.  
c070: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
c080: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
c090: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
c0a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
c0b0: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
c0c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
c0d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
c0e0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
c0f0: 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
c100: 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rr);.    assert(
c110: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
c120: 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  ed );.    if( z=
c130: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
c140: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
c150: 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20  ->errCode);.    
c160: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
c170: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
c180: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
c190: 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
c1a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
c1b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
c1c0: 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67  F-16 encoded Eng
c1d0: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
c1e0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
c1f0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
c200: 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
c210: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72  void *sqlite3_er
c220: 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a  rmsg16(sqlite3 *
c230: 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
c240: 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d  nst u16 outOfMem
c250: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20  [] = {.    'o', 
c260: 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27  'u', 't', ' ', '
c270: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d  o', 'f', ' ', 'm
c280: 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27  ', 'e', 'm', 'o'
c290: 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20  , 'r', 'y', 0.  
c2a0: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
c2b0: 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d  t u16 misuse[] =
c2c0: 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c   {.    'l', 'i',
c2d0: 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'b', 'r', 'a', 
c2e0: 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a  'r', 'y', ' ', .
c2f0: 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75      'r', 'o', 'u
c300: 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27  ', 't', 'i', 'n'
c310: 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'e', ' ', .   
c320: 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20   'c', 'a', 'l', 
c330: 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27  'l', 'e', 'd', '
c340: 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75   ', .    'o', 'u
c350: 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20  ', 't', ' ', .  
c360: 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c    'o', 'f', ' ',
c370: 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20   .    's', 'e', 
c380: 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27  'q', 'u', 'e', '
c390: 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a  n', 'c', 'e', 0.
c3a0: 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
c3b0: 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
c3c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
c3d0: 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
c3e0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
c3f0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
c400: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
c410: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
c420: 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73  )misuse;.  }.  s
c430: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
c440: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
c450: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c460: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
c470: 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
c480: 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
c490: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
c4a0: 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
c4b0: 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
c4c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c4d0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
c4e0: 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74  >pErr, -1, sqlit
c4f0: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
c500: 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Code),.         
c510: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
c520: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
c530: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
c540: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
c550: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
c560: 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
c570: 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
c580: 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
c590: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
c5a0: 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
c5b0: 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
c5c0: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
c5d0: 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
c5e0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
c5f0: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
c600: 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
c610: 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
c620: 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
c630: 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
c640: 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
c650: 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
c660: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
c670: 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
c680: 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
c690: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
c6a0: 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  led = 0;.  }.  s
c6b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
c6c0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
c6d0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
c6e0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c6f0: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
c700: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
c710: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
c720: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
c730: 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
c740: 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
c750: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
c760: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
c770: 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
c780: 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
c790: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
c7a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
c7b0: 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
c7c0: 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
c7d0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
c7e0: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
c7f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c800: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
c810: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
c820: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
c830: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
c840: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
c860: 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65  >errCode & db->e
c870: 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71  rrMask;.}.int sq
c880: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
c890: 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
c8a0: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
c8b0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
c8c0: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
c8d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c8e0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
c8f0: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
c900: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
c910: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
c920: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
c930: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
c940: 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ->errCode;.}../*
c950: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
c960: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
c970: 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65  ion for database
c980: 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65   "db".  The name
c990: 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64   is zName.** and
c9a0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
c9b0: 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   enc..*/.static 
c9c0: 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  int createCollat
c9d0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
c9e0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
c9f0: 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65   *zName, .  u8 e
ca00: 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  nc,.  void* pCtx
ca10: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
ca20: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
ca30: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
ca40: 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
ca50: 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
ca60: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
ca70: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
ca80: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
ca90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
caa0: 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65  Name);.  .  asse
cab0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
cac0: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
cad0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
cae0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
caf0: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
cb00: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
cb10: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
cb20: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
cb30: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
cb40: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
cb50: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
cb60: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
cb70: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
cb80: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
cb90: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
cba0: 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
cbb0: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
cbc0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
cbd0: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
cbe0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
cbf0: 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
cc00: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
cc10: 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
cc20: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
cc30: 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
cc40: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
cc50: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
cc60: 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
cc70: 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
cc80: 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
cc90: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
cca0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
ccb0: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
ccc0: 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
ccd0: 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
cce0: 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
ccf0: 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
cd00: 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
cd10: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
cd20: 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
cd30: 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
cd40: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
cd50: 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
cd60: 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
cd70: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
cd80: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
cd90: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
cda0: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
cdb0: 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
cdc0: 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
cdd0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
cde0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
cdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ce00: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
ce10: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
ce20: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
ce30: 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
ce40: 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
ce50: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
ce60: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
ce70: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
ce80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ce90: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
cea0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
ceb0: 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
cec0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
ced0: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
cee0: 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
cef0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
cf00: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
cf10: 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
cf20: 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
cf30: 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
cf40: 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
cf50: 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
cf60: 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
cf70: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
cf80: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
cf90: 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
cfa0: 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
cfb0: 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
cfc0: 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
cfd0: 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
cfe0: 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
cff0: 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
d000: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
d010: 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
d020: 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
d030: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
d040: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
d050: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
d060: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
d070: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
d080: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
d090: 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
d0a0: 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
d0b0: 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
d0c0: 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
d0d0: 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
d0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
d0f0: 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
d100: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d110: 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
d120: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
d130: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d140: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
d150: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
d160: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
d170: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
d180: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
d190: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43  LITE_NOMEM;.  pC
d1a0: 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
d1b0: 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
d1c0: 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
d1d0: 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
d1e0: 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
d1f0: 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
d200: 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
d210: 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73  6_ALIGNED));.  s
d220: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
d230: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
d240: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d250: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
d260: 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
d270: 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
d280: 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
d290: 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
d2a0: 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
d2b0: 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
d2c0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
d2d0: 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
d2e0: 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
d2f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
d300: 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
d310: 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
d320: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
d330: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
d340: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
d350: 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
d360: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
d370: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
d380: 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
d390: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
d3a0: 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
d3b0: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
d3c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
d3d0: 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
d3e0: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
d3f0: 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
d400: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
d410: 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  BER,.  SQLITE_MA
d420: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
d430: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
d440: 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69  sure the hard li
d450: 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20  mits are set to 
d460: 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65  reasonable value
d470: 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  s.*/.#if SQLITE_
d480: 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  MAX_LENGTH<100.#
d490: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
d4a0: 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  X_LENGTH must be
d4b0: 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
d4c0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
d4d0: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31  MAX_SQL_LENGTH<1
d4e0: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
d4f0: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
d500: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
d510: 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
d520: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
d530: 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41  LENGTH>SQLITE_MA
d540: 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72  X_LENGTH.# error
d550: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
d560: 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20  LENGTH must not 
d570: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
d580: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d590: 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  H.#endif.#if SQL
d5a0: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
d5b0: 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f  _SELECT<2.# erro
d5c0: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  r SQLITE_MAX_COM
d5d0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73  POUND_SELECT mus
d5e0: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a  t be at least 2.
d5f0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d600: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30  E_MAX_VDBE_OP<40
d610: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
d620: 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74  MAX_VDBE_OP must
d630: 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a   be at least 40.
d640: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d650: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
d660: 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  RG<0 || SQLITE_M
d670: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e  AX_FUNCTION_ARG>
d680: 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  1000.# error SQL
d690: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
d6a0: 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
d6b0: 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a  ween 0 and 1000.
d6c0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d6d0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30  E_MAX_ATTACHED<0
d6e0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41   || SQLITE_MAX_A
d6f0: 54 54 41 43 48 45 44 3e 36 32 0a 23 20 65 72 72  TTACHED>62.# err
d700: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
d710: 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
d720: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 36 32 0a  etween 0 and 62.
d730: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d740: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
d750: 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
d760: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
d770: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
d780: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
d790: 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
d7a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
d7b0: 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
d7c0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
d7d0: 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
d7e0: 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
d7f0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
d800: 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
d810: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
d820: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
d830: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
d840: 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   1.#endif.../*.*
d850: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
d860: 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
d870: 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
d880: 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
d890: 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
d8a0: 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
d8b0: 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
d8c0: 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
d8d0: 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
d8e0: 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
d8f0: 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
d900: 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
d910: 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
d920: 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
d930: 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
d940: 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
d950: 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
d960: 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
d970: 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
d980: 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
d990: 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
d9a0: 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
d9b0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
d9c0: 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
d9d0: 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
d9e0: 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56 49 44  mit;...  /* EVID
d9f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39  ENCE-OF: R-30189
da00: 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20  -54097 For each 
da10: 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53  limit category S
da20: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45  QLITE_LIMIT_NAME
da30: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
da40: 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
da50: 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  d set at compile
da60: 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65  -time by a C pre
da70: 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d  processor.  ** m
da80: 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49  acro called SQLI
da90: 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68  TE_MAX_NAME. (Th
daa0: 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74  e "_LIMIT_" in t
dab0: 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67  he name is chang
dac0: 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58  ed to.  ** "_MAX
dad0: 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  _".).  */.  asse
dae0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
daf0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
db00: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
db10: 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
db20: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
db30: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
db40: 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
db50: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29  MAX_SQL_LENGTH )
db60: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
db70: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
db80: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c  MIT_COLUMN]==SQL
db90: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
dba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
dbb0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
dbc0: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d  MIT_EXPR_DEPTH]=
dbd0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  =SQLITE_MAX_EXPR
dbe0: 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
dbf0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
dc00: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
dc10: 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51  OUND_SELECT]==SQ
dc20: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
dc30: 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73  D_SELECT);.  ass
dc40: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
dc50: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
dc60: 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  E_OP]==SQLITE_MA
dc70: 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61  X_VDBE_OP );.  a
dc80: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
dc90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
dca0: 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51  UNCTION_ARG]==SQ
dcb0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
dcc0: 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72  N_ARG );.  asser
dcd0: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
dce0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
dcf0: 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  HED]==SQLITE_MAX
dd00: 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61  _ATTACHED );.  a
dd10: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
dd20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
dd30: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
dd40: 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  TH]==.          
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
dd80: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
dd90: 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
dda0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
ddb0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
ddc0: 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54  E_NUMBER]==SQLIT
ddd0: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
dde0: 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74  UMBER);.  assert
ddf0: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
de00: 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
de10: 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
de20: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
de30: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
de40: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
de50: 47 47 45 52 5f 44 45 50 54 48 3d 3d 28 53 51 4c  GGER_DEPTH==(SQL
de60: 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29  ITE_N_LIMIT-1) )
de70: 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  ;...  if( limitI
de80: 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
de90: 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
dea0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
deb0: 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
dec0: 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
ded0: 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
dee0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20  Limit>=0 ){     
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df00: 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38   IMP: R-52476-28
df10: 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  732 */.    if( n
df20: 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
df30: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
df40: 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
df50: 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
df60: 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  Id];  /* IMP: R-
df70: 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20  51463-25634 */. 
df80: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
df90: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
dfa0: 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
dfb0: 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20  eturn oldLimit; 
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33      /* IMP: R-53
dfe0: 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a  341-35419 */.}..
dff0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e000: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
e010: 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61  arse both URIs a
e020: 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  nd non-URI filen
e030: 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74  ames passed by t
e040: 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50  he.** user to AP
e050: 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  I functions sqli
e060: 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  te3_open() or sq
e070: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c  lite3_open_v2(),
e080: 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73   and for databas
e090: 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66  e.** URIs specif
e0a0: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41  ied as part of A
e0b0: 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73  TTACH statements
e0c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
e0d0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
e0e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
e0f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
e100: 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a  FS to use (or.**
e110: 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69   a NULL to signi
e120: 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  fy the default V
e130: 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64  FS) if the URI d
e140: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
e150: 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71  a "vfs=xxx".** q
e160: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20  uery parameter. 
e170: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
e180: 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ent contains the
e190: 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49   URI (or non-URI
e1a0: 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74   filename).** it
e1b0: 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20  self. When this 
e1c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
e1d0: 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76  ed the *pFlags v
e1e0: 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  ariable should c
e1f0: 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65  ontain.** the de
e200: 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f  fault flags to o
e210: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
e220: 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68   handle with. Th
e230: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
e240: 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79  n.** *pFlags may
e250: 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f   be updated befo
e260: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20  re returning if 
e270: 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  the URI filename
e280: 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63   contains .** "c
e290: 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f  ache=xxx" or "mo
e2a0: 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61  de=xxx" query pa
e2b0: 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  rameters..**.** 
e2c0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
e2d0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
e2e0: 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
e2f0: 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74  se *ppVfs is set
e300: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
e310: 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f  the VFS that sho
e320: 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f  uld be used to o
e330: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
e340: 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69   file. *pzFile i
e350: 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
e360: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
e370: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
e380: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
e390: 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65   open. It is the
e3a0: 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
e3b0: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
e3c0: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
e3d0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
e3e0: 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a  e() to release.*
e3f0: 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a  * this buffer..*
e400: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
e410: 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e   occurs, then an
e420: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
e430: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
e440: 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20  nd *pzErrMsg.** 
e450: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
e460: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
e470: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e  containing an En
e480: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
e490: 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
e4a0: 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
e4b0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
e4c0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
e4d0: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a  tually release.*
e4e0: 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79  * this buffer by
e4f0: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
e500: 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _free()..*/.int 
e510: 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
e520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e530: 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20  DefaultVfs,     
e540: 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
e550: 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22   if no "vfs=xxx"
e560: 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f   query option */
e570: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e580: 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uri,            
e590: 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
e5a0: 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73  ated URI to pars
e5b0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
e5c0: 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
e5d0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
e5e0: 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  : SQLITE_OPEN_XX
e5f0: 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
e600: 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73  ite3_vfs **ppVfs
e610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e620: 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20  OUT: VFS to use 
e630: 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46  */ .  char **pzF
e640: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
e650: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69        /* OUT: Fi
e660: 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  lename component
e670: 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61   of URI */.  cha
e680: 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6a0: 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
e6b0: 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54  ge (if rc!=SQLIT
e6c0: 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  E_OK) */.){.  in
e6d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e6e0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
e6f0: 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73   flags = *pFlags
e700: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
e710: 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56  zVfs = zDefaultV
e720: 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  fs;.  char *zFil
e730: 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  e;.  char c;.  i
e740: 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65  nt nUri = sqlite
e750: 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b  3Strlen30(zUri);
e760: 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ..  assert( *pzE
e770: 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69  rrMsg==0 );..  i
e780: 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  f( ((flags & SQL
e790: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
e7a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
e7b0: 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 0a  nfig.bOpenUri) .
e7c0: 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26     && nUri>=5 &&
e7d0: 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66   memcmp(zUri, "f
e7e0: 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20  ile:", 5)==0 .  
e7f0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70  ){.    char *zOp
e800: 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  t;.    int eStat
e810: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e820: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73       /* Parser s
e830: 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e  tate when parsin
e840: 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74  g URI */.    int
e850: 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   iIn;           
e860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e870: 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
e880: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
e890: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
e8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
e8b0: 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
e8c0: 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ex */.    int nB
e8d0: 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20  yte = nUri+2;   
e8e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
e8f0: 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
e900: 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ocate */..    /*
e910: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53   Make sure the S
e920: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66  QLITE_OPEN_URI f
e930: 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e  lag is set to in
e940: 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46  dicate to the VF
e950: 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  S xOpen .    ** 
e960: 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72  method that ther
e970: 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70  e may be extra p
e980: 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77  arameters follow
e990: 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d  ing the file-nam
e9a0: 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73  e.  */.    flags
e9b0: 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
e9c0: 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49  URI;..    for(iI
e9d0: 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69  n=0; iIn<nUri; i
e9e0: 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28  In++) nByte += (
e9f0: 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b  zUri[iIn]=='&');
ea00: 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  .    zFile = sql
ea10: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
ea20: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  e);.    if( !zFi
ea30: 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
ea40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f  TE_NOMEM;..    /
ea50: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63  * Discard the sc
ea60: 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69  heme and authori
ea70: 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74  ty segments of t
ea80: 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69  he URI. */.    i
ea90: 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20  f( zUri[5]=='/' 
eaa0: 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20  && zUri[6]=='/' 
eab0: 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
eac0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
ead0: 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
eae0: 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e  [iIn]!='/' ) iIn
eaf0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  ++;..      if( i
eb00: 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
eb10: 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
eb20: 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
eb30: 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
eb40: 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
eb50: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
eb60: 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
eb70: 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
eb80: 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
eb90: 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
eba0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ebb0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
ebc0: 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
ebd0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
ebe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 49 6e 20  else{.      iIn 
ebf0: 3d 20 35 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 5;.    }..    
ec00: 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65  /* Copy the file
ec10: 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65  name and any que
ec20: 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e  ry parameters in
ec30: 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66  to the zFile buf
ec40: 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63  fer. .    ** Dec
ec50: 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63  ode %HH escape c
ec60: 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77  odes along the w
ec70: 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ay. .    **.    
ec80: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c  ** Within this l
ec90: 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53  oop, variable eS
eca0: 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20  tate may be set 
ecb0: 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65  to 0, 1 or 2, de
ecc0: 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  pending.    ** o
ecd0: 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f  n the parsing co
ece0: 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77  ntext. As follow
ecf0: 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
ed00: 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69     0: Parsing fi
ed10: 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20  le-name..    ** 
ed20: 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d    1: Parsing nam
ed30: 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
ed40: 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
ed50: 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
ed60: 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76  *   2: Parsing v
ed70: 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  alue section of 
ed80: 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65  a name=value que
ed90: 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  ry parameter..  
eda0: 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20    */.    eState 
edb0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
edc0: 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
edd0: 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a  =0 && c!='#' ){.
ede0: 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
edf0: 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20     if( c=='%' . 
ee00: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
ee10: 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
ee20: 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73  n]) .       && s
ee30: 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
ee40: 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20  Uri[iIn+1]) .   
ee50: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
ee60: 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74  t octet = (sqlit
ee70: 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
ee80: 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20  iIn++]) << 4);. 
ee90: 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20         octet += 
eea0: 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
eeb0: 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20  zUri[iIn++]);.. 
eec0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
eed0: 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74  ctet>=0 && octet
eee0: 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20  <256 );.        
eef0: 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a  if( octet==0 ){.
ef00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
ef10: 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
ef20: 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
ef30: 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
ef40: 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
ef50: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
ef60: 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
ef70: 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
ef80: 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
ef90: 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
efa0: 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
efb0: 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
efc0: 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
efd0: 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
efe0: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
eff0: 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
f000: 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
f010: 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
f020: 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
f030: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
f040: 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
f050: 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
f060: 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
f070: 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
f090: 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
f0a0: 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
f0b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
f0c0: 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
f0d0: 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
f0e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
f0f0: 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
f100: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
f110: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
f120: 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f   }.        c = o
f130: 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ctet;.      }els
f140: 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20  e if( eState==1 
f150: 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d  && (c=='&' || c=
f160: 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='=') ){.       
f170: 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d   if( zFile[iOut-
f180: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
f190: 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f     /* An empty o
f1a0: 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f  ption name. Igno
f1b0: 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61  re this option a
f1c0: 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20  ltogether. */.  
f1d0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
f1e0: 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
f1f0: 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55  [iIn]!='#' && zU
f200: 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29  ri[iIn-1]!='&' )
f210: 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
f220: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
f230: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f240: 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20  ( c=='&' ){.    
f250: 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
f260: 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
f270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f280: 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b       eState = 2;
f290: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2a0: 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
f2b0: 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74  }else if( (eStat
f2c0: 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20  e==0 && c=='?') 
f2d0: 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26  || (eState==2 &&
f2e0: 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20   c=='&') ){.    
f2f0: 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
f300: 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20     eState = 1;. 
f310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
f320: 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a  le[iOut++] = c;.
f330: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53      }.    if( eS
f340: 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b  tate==1 ) zFile[
f350: 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
f360: 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
f370: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
f380: 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
f390: 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  0';..    /* Chec
f3a0: 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  k if there were 
f3b0: 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63  any options spec
f3c0: 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c  ified that shoul
f3d0: 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  d be interpreted
f3e0: 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f   .    ** here. O
f3f0: 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ptions that are 
f400: 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65  interpreted here
f410: 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61   include "vfs" a
f420: 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20  nd those that.  
f430: 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20    ** correspond 
f440: 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61  to flags that ma
f450: 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  y be passed to t
f460: 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  he sqlite3_open_
f470: 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68  v2().    ** meth
f480: 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20  od. */.    zOpt 
f490: 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33  = &zFile[sqlite3
f4a0: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
f4b0: 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1];.    while( z
f4c0: 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Opt[0] ){.      
f4d0: 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74  int nOpt = sqlit
f4e0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29  e3Strlen30(zOpt)
f4f0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
f500: 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b  al = &zOpt[nOpt+
f510: 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56  1];.      int nV
f520: 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  al = sqlite3Strl
f530: 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20  en30(zVal);..   
f540: 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26     if( nOpt==3 &
f550: 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20  & memcmp("vfs", 
f560: 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  zOpt, 3)==0 ){. 
f570: 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56         zVfs = zV
f580: 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  al;.      }else{
f590: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
f5a0: 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20  OpenMode {.     
f5b0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f5c0: 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *z;.          in
f5d0: 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  t mode;.        
f5e0: 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  } *aMode = 0;.  
f5f0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64        char *zMod
f600: 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20  eType = 0;.     
f610: 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b     int mask = 0;
f620: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  .        int lim
f630: 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  it = 0;..       
f640: 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20   if( nOpt==5 && 
f650: 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20  memcmp("cache", 
f660: 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20  zOpt, 5)==0 ){. 
f670: 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
f680: 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
f690: 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b  aCacheMode[] = {
f6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
f6b0: 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45  shared",  SQLITE
f6c0: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
f6d0: 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
f6e0: 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51   { "private", SQ
f6f0: 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
f700: 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
f710: 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
f720: 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
f730: 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
f740: 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
f750: 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CACHE|SQLITE_OPE
f760: 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a  N_PRIVATECACHE;.
f770: 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
f780: 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20  = aCacheMode;.  
f790: 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
f7a0: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
f7b0: 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63  zModeType = "cac
f7c0: 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  he";.        }. 
f7d0: 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
f7e0: 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f  =4 && memcmp("mo
f7f0: 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30  de", zOpt, 4)==0
f800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
f810: 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
f820: 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d  Mode aOpenMode[]
f830: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
f840: 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45   { "ro",  SQLITE
f850: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d  _OPEN_READONLY }
f860: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
f870: 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "rw",  SQLITE_OP
f880: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20  EN_READWRITE }, 
f890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
f8a0: 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  rwc", SQLITE_OPE
f8b0: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
f8c0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
f8d0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
f8e0: 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
f8f0: 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
f900: 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
f910: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
f920: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
f930: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
f940: 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20 20  REATE;.         
f950: 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f   aMode = aOpenMo
f960: 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
f970: 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61  mit = mask & fla
f980: 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  gs;.          zM
f990: 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73  odeType = "acces
f9a0: 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  s";.        }.. 
f9b0: 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65         if( aMode
f9c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
f9d0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t i;.          i
f9e0: 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  nt mode = 0;.   
f9f0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
fa00: 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29  aMode[i].z; i++)
fa10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
fa20: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d  nst char *z = aM
fa30: 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20  ode[i].z;.      
fa40: 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d        if( nVal==
fa50: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
fa60: 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  z) && 0==memcmp(
fa70: 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29  zVal, z, nVal) )
fa80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
fa90: 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  mode = aMode[i].
faa0: 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mode;.          
fab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
fac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fad0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
fae0: 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  f( mode==0 ){.  
faf0: 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
fb00: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
fb10: 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25  rintf("no such %
fb20: 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f  s mode: %s", zMo
fb30: 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
fb40: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
fb50: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
fb60: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
fb70: 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
fb80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fb90: 20 20 20 20 69 66 28 20 6d 6f 64 65 3e 6c 69 6d      if( mode>lim
fba0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
fbb0: 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
fbc0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
fbd0: 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77  s mode not allow
fbe0: 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ed: %s",.       
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
fc20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
fc30: 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  c = SQLITE_PERM;
fc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
fc50: 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
fc60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
fc70: 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28         flags = (
fc80: 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c  flags & ~mask) |
fc90: 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
fca0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
fcb0: 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61  zOpt = &zVal[nVa
fcc0: 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  l+1];.    }..  }
fcd0: 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20  else{.    zFile 
fce0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
fcf0: 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66  (nUri+2);.    if
fd00: 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
fd10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
fd20: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65      memcpy(zFile
fd30: 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
fd40: 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d     zFile[nUri] =
fd50: 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
fd60: 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b  [nUri+1] = '\0';
fd70: 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d  .  }..  *ppVfs =
fd80: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
fd90: 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a  d(zVfs);.  if( *
fda0: 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ppVfs==0 ){.    
fdb0: 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
fdc0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
fdd0: 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a  such vfs: %s", z
fde0: 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  Vfs);.    rc = S
fdf0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
fe00: 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a  . parse_uri_out:
fe10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fe20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
fe30: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b  te3_free(zFile);
fe40: 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a  .    zFile = 0;.
fe50: 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20    }.  *pFlags = 
fe60: 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65  flags;.  *pzFile
fe70: 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75   = zFile;.  retu
fe80: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
fe90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
fea0: 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f  es the work of o
feb0: 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73  pening a databas
fec0: 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a  e on behalf of.*
fed0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
fee0: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65   and sqlite3_ope
fef0: 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62  n16(). The datab
ff00: 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46  ase filename "zF
ff10: 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73  ilename"  .** is
ff20: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a   UTF-8 encoded..
ff30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
ff40: 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f  enDatabase(.  co
ff50: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
ff60: 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65  ame, /* Database
ff70: 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20   filename UTF-8 
ff80: 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c  encoded */.  sql
ff90: 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
ffa0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
ffb0: 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61  rned database ha
ffc0: 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ndle */.  unsign
ffd0: 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  ed int flags,   
ffe0: 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20   /* Operational 
fff0: 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
10000 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
10010 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10020 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29   VFS to use */.)
10030 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c      /* Store all
10060 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65  ocated handle he
10070 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  re */.  int rc; 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
100a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
100b0 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20  isThreadsafe;   
100c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
100d0 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61  rue for threadsa
100e0 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  fe connections *
100f0 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20  /.  char *zOpen 
10100 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10110 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
10120 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  argument to pass
10130 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20   to BtreeOpen() 
10140 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
10150 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sg = 0;         
10160 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
10170 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74  ssage from sqlit
10180 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a  e3ParseUri() */.
10190 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
101a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
101b0 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
101c0 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
101d0 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
101e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
101f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
10200 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
10210 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
10220 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
10230 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
10240 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
10250 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
10260 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
10270 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
10280 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
10290 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
102a0 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
102b0 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
102c0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
102d0 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
102e0 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
102f0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
10300 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
10310 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
10320 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
10330 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
10340 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
10350 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
10360 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
10370 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
10380 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
103a0 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
103b0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
103c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
103d0 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
103e0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
103f0 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
10400 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
10410 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
10420 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
10430 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
10440 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
10450 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
10460 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
10470 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
10480 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
10490 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
104a0 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
104b0 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
104c0 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65   & 0x46)==0 ) re
104d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
104e0 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20  SE_BKPT;..  if( 
104f0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
10500 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
10510 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
10520 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
10530 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
10540 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
10550 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
10560 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
10570 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
10580 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
10590 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
105a0 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
105b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
105c0 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
105d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
105e0 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20  FullMutex;.  }. 
105f0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
10600 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
10610 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
10620 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
10630 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
10640 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
10650 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
10660 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
10670 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
10680 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
10690 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
106a0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
106b0 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
106c0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
106d0 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
106e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
106f0 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
10700 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
10710 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
10720 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
10730 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
10740 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
10750 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
10760 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
10770 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
10780 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
10790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
107a0 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
107b0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
107c0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
107d0 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
107e0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
107f0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
10800 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
10810 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
10820 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
10830 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
10840 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
10850 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
10860 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
10870 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
10890 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
108a0 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
108b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
108c0 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
108d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
108e0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
108f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10900 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
10910 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
10920 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10930 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
10940 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
10950 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10960 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
10970 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
10980 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
10990 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
109a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
109b0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
109c0 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
109d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
109e0 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
109f0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10a00 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
10a10 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
10a20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
10a30 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
10a40 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
10a50 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
10a60 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
10a70 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
10a80 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
10a90 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
10aa0 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
10ab0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
10ac0 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a  isThreadsafe ){.
10ad0 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
10ae0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
10af0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
10b00 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
10b10 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
10b20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10b30 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
10b40 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
10b50 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
10b60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
10b70 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10b80 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
10b90 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
10ba0 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
10bb0 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
10bc0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
10bd0 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
10be0 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20  ->aDbStatic;..  
10bf0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
10c00 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
10c10 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
10c20 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
10c30 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
10c40 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
10c50 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75  imit));.  db->au
10c60 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
10c70 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
10c80 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74  = -1;.  db->next
10c90 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20  Pagesize = 0;.  
10ca0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
10cb0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
10cc0 73 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s | SQLITE_AutoI
10cd0 6e 64 65 78 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ndex | SQLITE_En
10ce0 61 62 6c 65 54 72 69 67 67 65 72 0a 23 69 66 20  ableTrigger.#if 
10cf0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
10d00 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
10d20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
10d30 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
10d40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10d50 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
10d80 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
10d90 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
10da0 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
10db0 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
10dc0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
10dd0 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
10de0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
10df0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
10e00 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51  EIGN_KEYS) && SQ
10e10 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
10e20 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20  EIGN_KEYS.      
10e30 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
10e40 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a  ITE_ForeignKeys.
10e50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
10e60 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
10e70 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
10e80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10e90 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10ea0 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
10eb0 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
10ec0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
10ed0 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
10ee0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
10ef0 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
10f00 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
10f10 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
10f20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
10f30 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
10f40 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
10f50 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
10f60 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
10f70 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
10f80 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
10f90 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
10fa0 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72  ilure..  */.  cr
10fb0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
10fc0 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
10fd0 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
10fe0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
10ff0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
11000 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
11010 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20  ITE_UTF16BE, 0, 
11020 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
11030 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
11040 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
11050 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
11060 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
11070 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
11080 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
11090 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
110a0 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f   (void*)1, binCo
110b0 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66  llFunc, 0);.  if
110c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
110d0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
110e0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
110f0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
11100 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
11110 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
11120 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30  TF8, "BINARY", 0
11130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
11140 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b  >pDfltColl!=0 );
11150 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20  ..  /* Also add 
11160 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73  a UTF-8 case-ins
11170 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69  ensitive collati
11180 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a  on sequence. */.
11190 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
111a0 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
111b0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
111c0 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
111d0 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50  unc, 0);..  /* P
111e0 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
111f0 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20  e/URI argument. 
11200 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
11210 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
11220 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
11230 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
11240 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
11250 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
11260 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
11270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11290 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e  ITE_NOMEM ) db->
112a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
112b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
112c0 6f 72 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d  or(db, rc, zErrM
112d0 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a  sg ? "%s" : 0, z
112e0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
112f0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
11300 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  g);.    goto ope
11310 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
11320 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b  /* Open the back
11330 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69  end database dri
11340 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ver */.  rc = sq
11350 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
11360 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20  b->pVfs, zOpen, 
11370 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e  db, &db->aDb[0].
11380 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBt, 0,.        
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
113b0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20  PEN_MAIN_DB);.  
113c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
113d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
113e0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
113f0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  MEM ){.      rc 
11400 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11410 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11420 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
11430 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
11440 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62  db_out;.  }.  db
11450 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61  ->aDb[0].pSchema
11460 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11470 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  Get(db, db->aDb[
11480 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
11490 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[1].pSchema = 
114a0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
114b0 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20  (db, 0);...  /* 
114c0 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
114d0 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
114e0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
114f0 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68  s 'full'; for th
11500 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
11510 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45  base it is 'NONE
11520 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  '. This matches 
11530 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
11540 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
11550 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
11560 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
11570 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
11580 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64  y_level = 3;.  d
11590 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
115a0 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e  = "temp";.  db->
115b0 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[1].safety_le
115c0 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e  vel = 1;..  db->
115d0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
115e0 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
115f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11600 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
11610 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
11620 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
11630 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
11640 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
11650 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
11660 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
11670 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
11680 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
11690 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
116a0 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
116b0 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
116c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
116d0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
116e0 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
116f0 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
11700 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  nFunctions(db);.
11710 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
11720 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
11730 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
11740 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
11750 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
11760 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
11770 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
11780 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
11790 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
117a0 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
117b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
117c0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
117d0 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
117e0 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
117f0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
11800 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11820 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
11830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
11840 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11850 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
11860 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11870 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
11880 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
11890 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
118a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
118b0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
118c0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
118d0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
118e0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
118f0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
11900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11910 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
11920 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
11930 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
11940 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
11950 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
11960 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11970 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20  ABLE_FTS3.  if( 
11980 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
11990 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
119a0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
119b0 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64  qlite3Fts3Init(d
119c0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
119d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
119e0 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21  ABLE_ICU.  if( !
119f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11a00 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11a10 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
11a20 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
11a30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
11a40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11a50 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
11a60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11a70 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11a80 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
11a90 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
11aa0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
11ab0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
11ac0 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  , rc, 0);..  /* 
11ad0 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
11ae0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
11af0 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
11b00 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
11b10 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
11b20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
11b30 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
11b40 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
11b50 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
11b60 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
11b70 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
11b80 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
11b90 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
11ba0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
11bb0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
11bc0 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
11bd0 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
11be0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
11bf0 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
11c00 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
11c10 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
11c20 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
11c30 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
11c60 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
11c70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62  endif..  /* Enab
11c80 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
11c90 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
11ca0 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
11cb0 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
11cc0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
11cd0 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
11d00 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
11d10 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
11d20 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
11d30 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
11d40 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
11d50 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
11d60 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  endb_out:.  sqli
11d70 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b  te3_free(zOpen);
11d80 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
11d90 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
11da0 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
11db0 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  dsafe==0 || sqli
11dc0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11dd0 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
11de0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
11df0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11e00 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
11e10 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
11e20 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
11e30 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
11e40 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
11e50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
11e60 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
11e70 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
11e80 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
11e90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11ea0 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
11eb0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
11ec0 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a  IC_SICK;.  }.  *
11ed0 70 70 44 62 20 3d 20 64 62 3b 0a 20 20 72 65 74  ppDb = db;.  ret
11ee0 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78  urn sqlite3ApiEx
11ef0 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  it(0, rc);.}../*
11f00 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
11f10 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
11f20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
11f30 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
11f40 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  r *zFilename, . 
11f50 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20   sqlite3 **ppDb 
11f60 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
11f70 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
11f80 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  ame, ppDb,.     
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11fb0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
11fc0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
11fd0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
11fe0 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
11ff0 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
12000 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
12010 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
12020 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
12030 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
12040 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
12050 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
12060 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
12070 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
12080 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
12090 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
120a0 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
120b0 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
120c0 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
120d0 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
120e0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
120f0 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
12100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12110 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
12120 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
12130 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
12140 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
12150 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
12160 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
12170 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
12180 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
12190 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
121a0 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
121b0 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
121c0 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
121d0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
121e0 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
121f0 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  ..  assert( zFil
12200 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  ename );.  asser
12210 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70  t( ppDb );.  *pp
12220 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
12230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12240 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
12250 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
12260 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
12270 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
12280 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
12290 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
122a0 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
122b0 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65  (pVal, -1, zFile
122c0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  name, SQLITE_UTF
122d0 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45  16NATIVE, SQLITE
122e0 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c  _STATIC);.  zFil
122f0 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  ename8 = sqlite3
12300 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
12310 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
12320 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29  if( zFilename8 )
12330 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  {.    rc = openD
12340 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
12350 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  e8, ppDb,.      
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
12380 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
12390 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
123a0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44      assert( *ppD
123b0 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b || rc==SQLITE_
123c0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28  NOMEM );.    if(
123d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
123e0 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  & !DbHasProperty
123f0 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63  (*ppDb, 0, DB_Sc
12400 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20  hemaLoaded) ){. 
12410 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20       ENC(*ppDb) 
12420 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
12430 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  TIVE;.    }.  }e
12440 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
12450 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12460 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
12470 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
12480 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78  urn sqlite3ApiEx
12490 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e  it(0, rc);.}.#en
124a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
124b0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
124c0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
124d0 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
124e0 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
124f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
12500 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12510 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
12520 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
12530 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
12540 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
12550 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
12560 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
12570 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
12580 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
12590 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
125a0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
125b0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
125c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
125d0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
125e0 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
125f0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
12600 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
12610 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
12620 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  re, 0);.  rc = s
12630 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
12640 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
12650 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12660 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
12670 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
12680 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
12690 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
126a0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
126b0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
126c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
126d0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
126e0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
126f0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
12700 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
12710 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
12720 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
12730 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
12740 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
12750 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
12760 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
12770 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
12780 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12790 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
127a0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
127b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
127c0 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
127d0 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
127e0 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
127f0 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
12800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
12810 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
12820 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12830 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
12840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12860 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
12870 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
12880 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12890 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
128a0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
128b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
128c0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
128d0 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
128e0 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
128f0 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
12900 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
12910 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
12920 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
12930 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
12940 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
12950 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12960 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
12970 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
12980 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
12990 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
129a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
129b0 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
129c0 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
129d0 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
129e0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
129f0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
12a00 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
12a10 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
12a20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
12a30 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
12a40 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12a50 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
12a60 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
12a70 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
12a80 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
12a90 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12aa0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
12ab0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
12ac0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
12ad0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
12ae0 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
12af0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
12b00 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
12b10 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
12b20 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
12b30 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
12b40 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
12b50 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
12b60 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
12b70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
12b80 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
12b90 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
12ba0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
12bb0 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
12bc0 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
12bd0 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
12be0 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
12bf0 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ).){.  sqlite3_m
12c00 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
12c10 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
12c20 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c  llNeeded = xColl
12c30 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43  Needed;.  db->xC
12c40 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b  ollNeeded16 = 0;
12c50 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
12c60 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
12c70 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
12c80 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
12c90 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
12ca0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12cc0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
12cd0 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
12ce0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
12cf0 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
12d00 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
12d10 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
12d20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
12d30 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
12d40 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12d50 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
12d60 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
12d70 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a  ation_needed16(.
12d80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
12d90 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
12da0 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
12db0 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28  *xCollNeeded16)(
12dc0 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
12dd0 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
12de0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71  t void*).){.  sq
12df0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12e00 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
12e10 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
12e20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  = 0;.  db->xColl
12e30 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c  Needed16 = xColl
12e40 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e  Needed16;.  db->
12e50 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
12e60 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
12e70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12e80 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12ea0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
12eb0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
12ec0 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TF16 */..#ifndef
12ed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
12ee0 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
12ef0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
12f00 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73  ow an anachronis
12f10 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  m. It used to be
12f20 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72   used to recover
12f30 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f   from a.** mallo
12f40 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74  c() failure, but
12f50 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73   SQLite now does
12f60 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61   this automatica
12f70 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
12f80 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
12f90 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  er(void){.  retu
12fa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12fb0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65  #endif../*.** Te
12fc0 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
12fd0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74  r or not the dat
12fe0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12ff0 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
13000 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75  t.** mode.  Retu
13010 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
13020 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
13030 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d  t.  Autocommit m
13040 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20  ode is on.** by 
13050 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f  default.  Autoco
13060 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64  mmit is disabled
13070 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74   by a BEGIN stat
13080 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62  ement and reenab
13090 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65  led.** by the ne
130a0 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c  xt COMMIT or ROL
130b0 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  LBACK..**.******
130c0 2a 20 54 48 49 53 20 49 53 20 41 4e 20 45 58 50  * THIS IS AN EXP
130d0 45 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e  ERIMENTAL API AN
130e0 44 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f 20  D IS SUBJECT TO 
130f0 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f  CHANGE ******.*/
13100 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74  .int sqlite3_get
13110 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69  _autocommit(sqli
13120 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
13130 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  rn db->autoCommi
13140 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
13150 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
13160 65 73 20 61 72 65 20 73 75 62 74 69 74 75 74 65  es are subtitute
13170 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  s for constants 
13180 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a  SQLITE_CORRUPT,.
13190 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ** SQLITE_MISUSE
131a0 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
131b0 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  N, SQLITE_IOERR 
131c0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68  and possibly oth
131d0 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73  er error.** cons
131e0 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72  tants.  They ser
131f0 76 65 72 20 74 77 6f 20 70 75 72 70 6f 73 65 73  ver two purposes
13200 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65  :.**.**   1.  Se
13210 72 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69  rve as a conveni
13220 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74  ent place to set
13230 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e   a breakpoint in
13240 20 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20   a debugger.**  
13250 20 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77       to detect w
13260 68 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f  hen version erro
13270 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63  r conditions occ
13280 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  urs..**.**   2. 
13290 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
132a0 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65  log() to provide
132b0 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
132c0 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a   location where.
132d0 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c  **       a low-l
132e0 65 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69  evel error is fi
132f0 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f  rst detected..*/
13300 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
13310 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  uptError(int lin
13320 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
13330 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
13340 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
13350 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
13360 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20  QLITE_CORRUPT,. 
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61               "da
13380 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
13390 6e 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  n at line %d of 
133a0 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
133b0 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
133c0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
133d0 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
133e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
133f0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
13400 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
13410 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
13420 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
13430 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
13440 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
13450 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a  SQLITE_MISUSE, .
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6d                "m
13470 69 73 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64  isuse at line %d
13480 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
13490 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
134a0 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
134b0 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
134c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
134d0 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  SE;.}.int sqlite
134e0 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69  3CantopenError(i
134f0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
13500 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
13510 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
13520 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
13530 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54  _log(SQLITE_CANT
13540 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20  OPEN, .         
13550 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65       "cannot ope
13560 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25  n file at line %
13570 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
13590 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
135a0 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
135b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
135c0 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TOPEN;.}...#ifnd
135d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
135e0 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
135f0 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e  This is a conven
13600 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68  ience routine th
13610 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  at makes sure th
13620 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70  at all thread-sp
13630 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66  ecific.** data f
13640 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68  or this thread h
13650 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  as been dealloca
13660 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ted..**.** SQLit
13670 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
13680 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
13690 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f   data so this ro
136a0 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a  utine is now a.*
136b0 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20  * no-op.  It is 
136c0 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73  retained for his
136d0 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
136e0 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ility..*/.void s
136f0 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
13700 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23  eanup(void){.}.#
13710 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
13720 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
13730 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
13740 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
13750 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
13760 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
13770 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
13780 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
13790 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64  details..*/.#ifd
137a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
137b0 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
137c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62  .int sqlite3_tab
137d0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
137e0 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ta(.  sqlite3 *d
137f0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
13800 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
13810 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
13820 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
13830 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
13840 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c  ase name or NULL
13850 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13860 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *zTableName,   
13870 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
13880 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13890 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20  *zColumnName,   
138a0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
138b0 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
138c0 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20  **pzDataType,   
138d0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c   /* OUTPUT: Decl
138e0 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a  ared data type *
138f0 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
13900 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20  *pzCollSeq,     
13910 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61  /* OUTPUT: Colla
13920 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
13930 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f  me */.  int *pNo
13940 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  tNull,          
13950 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
13960 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20  rue if NOT NULL 
13970 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
13980 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69  s */.  int *pPri
13990 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20  maryKey,        
139a0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
139b0 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72  ue if column par
139c0 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74  t of PK */.  int
139d0 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20   *pAutoinc      
139e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
139f0 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
13a00 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65  mn is auto-incre
13a10 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
13a20 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
13a30 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c  rMsg = 0;.  Tabl
13a40 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43  e *pTab = 0;.  C
13a50 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
13a60 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20  .  int iCol;..  
13a70 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74  char const *zDat
13a80 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  aType = 0;.  cha
13a90 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65  r const *zCollSe
13aa0 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74  q = 0;.  int not
13ab0 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  null = 0;.  int 
13ac0 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a  primarykey = 0;.
13ad0 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20    int autoinc = 
13ae0 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  0;..  /* Ensure 
13af0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
13b00 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61  ema has been loa
13b10 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
13b20 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
13b30 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
13b40 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
13b50 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
13b60 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72  te3Init(db, &zEr
13b70 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c  rMsg);.  if( SQL
13b80 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
13b90 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
13ba0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
13bb0 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
13bc0 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54  question */.  pT
13bd0 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
13be0 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65  Table(db, zTable
13bf0 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  Name, zDbName);.
13c00 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70    if( !pTab || p
13c10 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
13c20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
13c30 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
13c40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
13c50 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   the column for 
13c60 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65  which info is re
13c70 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
13c80 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
13c90 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
13ca0 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
13cb0 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20  >iPKey;.    if( 
13cc0 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
13cd0 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
13ce0 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  Col[iCol];.    }
13cf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
13d00 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
13d10 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
13d20 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d  +){.      pCol =
13d30 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
13d40 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  l];.      if( 0=
13d50 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
13d60 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
13d70 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
13d80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13da0 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43  ( iCol==pTab->nC
13db0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ol ){.      pTab
13dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
13dd0 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
13de0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
13df0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
13e00 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20  stores the meta 
13e10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
13e20 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
13e30 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61  d.  ** to the ca
13e40 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ller in local va
13e50 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70  riables zDataTyp
13e60 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74  e, zCollSeq, not
13e70 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79  null, primarykey
13e80 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e  .  ** and autoin
13e90 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  c. At this point
13ea0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
13eb0 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20  ossibilities:.  
13ec0 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20  ** .  **     1. 
13ed0 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  The specified co
13ee0 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f  lumn name was ro
13ef0 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22  wid", "oid" or "
13f00 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20  _rowid_" .  **  
13f10 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20        and there 
13f20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79  is no explicitly
13f30 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f   declared IPK co
13f40 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  lumn. .  **.  **
13f50 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c       2. The tabl
13f60 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
13f70 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  and the column n
13f80 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61  ame identified a
13f90 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65  n .  **        e
13fa0 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
13fb0 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20  ed column. Copy 
13fc0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
13fd0 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a   from *pCol..  *
13fe0 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b  / .  if( pCol ){
13ff0 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
14000 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
14010 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f    zCollSeq = pCo
14020 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f  l->zColl;.    no
14030 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f  tnull = pCol->no
14040 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72  tNull!=0;.    pr
14050 69 6d 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c  imarykey  = pCol
14060 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a  ->isPrimKey!=0;.
14070 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54      autoinc = pT
14080 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
14090 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
140a0 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
140b0 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c  ement)!=0;.  }el
140c0 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
140d0 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
140e0 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
140f0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
14100 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
14110 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59  ollSeq = "BINARY
14120 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  ";.  }..error_ou
14130 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t:.  sqlite3Btre
14140 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
14150 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
14160 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
14170 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
14180 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
14190 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
141a0 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
141b0 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
141c0 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
141d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
141e0 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
141f0 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
14200 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
14210 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
14220 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
14230 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
14240 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
14250 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
14260 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
14270 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
14280 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
14290 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
142a0 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
142b0 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
142c0 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
142d0 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
142e0 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
142f0 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
14300 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
14310 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
14320 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
14330 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
14340 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
14350 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
14360 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
14370 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
14380 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
14390 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
143a0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
143b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
143c0 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45  rror(db, rc, (zE
143d0 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
143e0 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
143f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
14400 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
14410 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
14420 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
14430 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
14440 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
14450 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
14460 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
14470 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
14480 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
14490 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
144a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
144b0 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
144c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
144d0 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
144e0 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
144f0 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
14500 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
14510 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
14520 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
14530 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
14540 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
14550 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
14560 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
14570 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
14580 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
14590 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
145a0 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
145b0 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
145c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
145d0 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
145e0 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
145f0 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
14600 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14610 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
14620 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
14630 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
14640 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14650 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
14660 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
14670 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
14680 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
14690 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
146a0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
146b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
146c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
146d0 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
146e0 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
146f0 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
14700 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
14710 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
14720 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
14730 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
14740 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
14750 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
14760 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
14770 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
14780 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
14790 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
147a0 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20  ex);.  pBtree = 
147b0 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
147c0 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
147d0 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
147e0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
147f0 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
14800 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20  3_file *fd;.    
14810 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14820 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
14830 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
14840 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65  treePager(pBtree
14850 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14860 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
14870 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
14880 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
14890 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
148a0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   );.    if( op==
148b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
148c0 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
148d0 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
148e0 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20  e**)pArg = fd;. 
148f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14900 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
14910 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  f( fd->pMethods 
14920 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
14930 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
14940 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29  ol(fd, op, pArg)
14950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14970 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20  OTFOUND;.    }. 
14980 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
14990 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
149a0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
149b0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
149c0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
149d0 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74     .}../*.** Int
149e0 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
149f0 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
14a00 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
14a10 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
14a20 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
14a30 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
14a40 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
14a50 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20  _TEST.  va_list 
14a60 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
14a70 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
14a80 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
14a90 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
14aa0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
14ab0 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
14ac0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
14ad0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
14ae0 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
14af0 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
14b00 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
14b10 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14b20 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
14b30 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
14b40 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
14b50 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
14b60 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
14b70 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
14b80 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
14b90 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
14ba0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
14bb0 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
14bc0 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
14bd0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
14be0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
14bf0 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
14c00 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
14c10 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
14c20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c30 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
14c40 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
14c50 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
14c60 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
14c70 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
14c80 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
14c90 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
14ca0 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
14cb0 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
14cc0 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
14cd0 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
14ce0 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
14cf0 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
14d00 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
14d10 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
14d20 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
14d30 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65   sqlite3PrngRese
14d40 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  tState();.      
14d50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
14d60 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
14d70 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
14d80 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
14d90 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
14da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
14db0 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
14dc0 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
14dd0 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
14de0 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
14df0 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
14e00 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
14e10 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
14e20 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
14e30 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
14e40 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
14e50 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
14e60 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
14e70 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
14e80 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
14e90 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
14ea0 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
14eb0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
14ec0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
14ed0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
14ee0 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
14ef0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
14f00 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
14f10 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
14f20 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
14f30 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
14f40 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
14f50 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
14f60 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
14f70 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14f80 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
14f90 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45  _test_control(BE
14fa0 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
14fb0 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29  S, xBegin, xEnd)
14fc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
14fd0 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f  egister hooks to
14fe0 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74   call to indicat
14ff0 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29  e which malloc()
15000 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a   failures .    *
15010 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20  * are benign..  
15020 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
15030 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45  LITE_TESTCTRL_BE
15040 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
15050 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  S: {.      typed
15060 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66  ef void (*void_f
15070 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a  unction)(void);.
15080 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
15090 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e  ion xBenignBegin
150a0 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
150b0 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64  ction xBenignEnd
150c0 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42  ;.      xBenignB
150d0 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70  egin = va_arg(ap
150e0 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
150f0 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45  ;.      xBenignE
15100 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nd = va_arg(ap, 
15110 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
15120 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e        sqlite3Ben
15130 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78  ignMallocHooks(x
15140 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65  BenignBegin, xBe
15150 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20  nignEnd);.      
15160 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15170 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
15180 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
15190 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
151a0 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  L_PENDING_BYTE, 
151b0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a  unsigned int X).
151c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
151d0 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  t the PENDING by
151e0 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  te to the value 
151f0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  in the argument,
15200 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20   if X>0..    ** 
15210 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
15220 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e  if X==0.  Return
15230 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
15240 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20  e pending byte. 
15250 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73     ** as it exis
15260 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73  ting before this
15270 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
15280 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
15290 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43  ** IMPORTANT:  C
152a0 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
152b0 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78  ING byte from 0x
152c0 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73  40000000 results
152d0 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e   in.    ** an in
152e0 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62  compatible datab
152f0 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ase file format.
15300 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
15310 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20  ENDING byte.    
15320 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74  ** while any dat
15330 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15340 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73   is open results
15350 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   in undefined an
15360 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72  d.    ** dileter
15370 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20  ious behavior.. 
15380 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15390 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
153a0 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20  ENDING_BYTE: {. 
153b0 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e       rc = PENDIN
153c0 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20  G_BYTE;.#ifndef 
153d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
153e0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
153f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77  unsigned int new
15400 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Val = va_arg(ap,
15410 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a   unsigned int);.
15420 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56          if( newV
15430 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64  al ) sqlite3Pend
15440 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c  ingByte = newVal
15450 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
15460 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15470 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
15480 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
15490 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
154a0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
154b0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
154c0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
154d0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
154e0 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
154f0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
15500 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
15510 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
15520 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49  compile-time.  I
15530 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20  f X is true and 
15540 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20  assert().    ** 
15550 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
15560 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15570 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58  e is true.  If X
15580 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20   is true and.   
15590 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20   ** assert() is 
155a0 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
155b0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
155c0 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69  is zero.  If X i
155d0 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61  s.    ** false a
155e0 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65  nd assert() is e
155f0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
15600 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73   assertion fires
15610 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
15620 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20  process aborts. 
15630 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61   If X is false a
15640 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64  nd assert() is d
15650 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
15660 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  e.    ** return 
15670 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20  value is zero.. 
15680 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15690 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
156a0 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76  SSERT: {.      v
156b0 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20  olatile int x = 
156c0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
156d0 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (x = va_arg(ap,
156e0 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  int))!=0 );.    
156f0 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20    rc = x;.      
15700 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
15710 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
15720 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
15730 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
15740 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58  RL_ALWAYS, int X
15750 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
15760 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
15770 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
15780 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20  test to see how 
15790 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20  the ALWAYS and. 
157a0 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72     ** NEVER macr
157b0 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  os were defined 
157c0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
157d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
157e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
157f0 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a  is ALWAYS(X).  .
15800 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
15810 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
15820 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
15830 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
15840 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
15850 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
15860 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
15870 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
15880 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
15890 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
158a0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
158b0 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
158c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
158d0 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
158e0 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
158f0 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
15900 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
15910 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
15920 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
15930 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
15940 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
15950 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
15960 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
15970 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
15980 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
15990 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
159a0 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
159b0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
159c0 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
159d0 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
159e0 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
159f0 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
15a00 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
15a10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15a20 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
15a30 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
15a40 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
15a50 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
15a60 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
15a70 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
15a80 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
15a90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
15aa0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
15ab0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
15ac0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
15ad0 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
15ae0 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
15af0 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
15b00 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
15b10 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
15b20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
15b30 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
15b40 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
15b50 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
15b60 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
15b70 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
15b80 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
15b90 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
15ba0 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
15bb0 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
15bc0 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
15bd0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
15be0 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
15bf0 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
15c00 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
15c10 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
15c20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
15c30 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
15c40 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
15c50 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
15c60 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78     rc = ALWAYS(x
15c70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15c80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
15c90 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
15ca0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
15cb0 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71  CTRL_RESERVE, sq
15cc0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
15cd0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
15ce0 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65  Set the nReserve
15cf0 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74   size to N for t
15d00 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15d10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15d20 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  .    ** connecti
15d30 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  on db..    */.  
15d40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
15d50 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20  STCTRL_RESERVE: 
15d60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
15d70 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
15d80 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
15d90 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
15da0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
15db0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15dc0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
15dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
15de0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62  eeSetPageSize(db
15df0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
15e00 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   x, 0);.      sq
15e10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15e20 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
15e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15e40 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
15e50 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
15e60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
15e70 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71  PTIMIZATIONS, sq
15e80 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
15e90 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
15ea0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
15eb0 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  e various optimi
15ec0 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74  zations for test
15ed0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
15ee0 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d  he .    ** argum
15ef0 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61  ent N is a bitma
15f00 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  sk of optimizati
15f10 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ons to be disabl
15f20 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a  ed.  For normal.
15f30 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
15f40 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20   N should be 0. 
15f50 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
15f60 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d  t a test program
15f70 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a   (like the.    *
15f80 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74  * SQL Logic Test
15f90 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64   or SLT test mod
15fa0 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65  ule) can run the
15fb0 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70   same SQL multip
15fc0 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20  le times.    ** 
15fd0 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74  with various opt
15fe0 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62  imizations disab
15ff0 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68  led to verify th
16000 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
16010 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74  er.    ** is obt
16020 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63  ained in every c
16030 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
16040 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
16050 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
16060 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NS: {.      sqli
16070 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
16080 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
16090 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
160a0 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
160b0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20      db->flags = 
160c0 28 78 20 26 20 53 51 4c 49 54 45 5f 4f 70 74 4d  (x & SQLITE_OptM
160d0 61 73 6b 29 20 7c 20 28 64 62 2d 3e 66 6c 61 67  ask) | (db->flag
160e0 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 70 74 4d  s & ~SQLITE_OptM
160f0 61 73 6b 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ask);.      brea
16100 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  k;.    }..#ifdef
16110 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
16120 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  D.    /* sqlite3
16130 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
16140 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
16150 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63  KEYWORD, const c
16160 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20  har *zWord).    
16170 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f  **.    ** If zWo
16180 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20  rd is a keyword 
16190 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68  recognized by th
161a0 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72  e parser, then r
161b0 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a  eturn the.    **
161c0 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f   number of keywo
161d0 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72  rds.  Or if zWor
161e0 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f  d is not a keywo
161f0 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  rd, return 0..  
16200 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69    ** .    ** Thi
16210 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69  s test feature i
16220 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
16230 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
16240 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a  tion since.    *
16250 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b  * the SQLITE_N_K
16260 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20  EYWORD macro is 
16270 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74  not defined in t
16280 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69  his file if SQLi
16290 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69  te.    ** is bui
162a0 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  lt using separat
162b0 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a  e source files..
162c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
162d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
162e0 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20  ISKEYWORD: {.   
162f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16300 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70  Word = va_arg(ap
16310 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
16320 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
16330 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57  lite3Strlen30(zW
16340 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ord);.      rc =
16350 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64   (sqlite3Keyword
16360 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c  Code((u8*)zWord,
16370 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51   n)!=TK_ID) ? SQ
16380 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a  LITE_N_KEYWORD :
16390 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
163a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a  .    }.#endif ..
163b0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
163c0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
163d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41  TE_TESTCTRL_SCRA
163e0 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26  TCHMALLOC, sz, &
163f0 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20  pNew, pFree);.  
16400 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73    **.    ** Pass
16410 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69   pFree into sqli
16420 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29  te3ScratchFree()
16430 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e  . .    ** If sz>
16440 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  0 then allocate 
16450 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72  a scratch buffer
16460 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20   into pNew.  .  
16470 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
16480 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43  LITE_TESTCTRL_SC
16490 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  RATCHMALLOC: {. 
164a0 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65       void *pFree
164b0 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20  , **ppNew;.     
164c0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73   int sz;.      s
164d0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
164e0 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77  nt);.      ppNew
164f0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
16500 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72  id**);.      pFr
16510 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ee = va_arg(ap, 
16520 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66  void*);.      if
16530 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20  ( sz ) *ppNew = 
16540 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
16550 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
16560 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
16570 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
16580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16590 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
165a0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
165b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
165c0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
165d0 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
165e0 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
165f0 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
16600 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72  n-zero, configur
16610 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73  e the wrappers s
16620 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a  o that all.    *
16630 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * subsequent cal
16640 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28  ls to localtime(
16650 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66  ) and variants f
16660 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73  ail. If onoff is
16670 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e   zero,.    ** un
16680 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
16690 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
166a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
166b0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
166c0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
166d0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
166e0 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
166f0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
16700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16710 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
16720 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
16730 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 20  REE_EXPLAIN).   
16740 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
16750 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
16760 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41  E_TESTCTRL_EXPLA
16770 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a 2a 20  IN_STMT,.    ** 
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
167a0 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tmt*,const char*
167b0 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  *);.    **.    *
167c0 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  * If compiled wi
167d0 74 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  th SQLITE_ENABLE
167e0 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c 20 65  _TREE_EXPLAIN, e
167f0 61 63 68 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ach sqlite3_stmt
16800 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20 61 20   holds.    ** a 
16810 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
16820 72 69 62 65 73 20 74 68 65 20 6f 70 74 69 6d 69  ribes the optimi
16830 7a 65 64 20 70 61 72 73 65 20 74 72 65 65 2e 20  zed parse tree. 
16840 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74 72   This test-contr
16850 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  ol.    ** return
16860 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
16870 68 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  hat string..    
16880 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
16890 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c  TE_TESTCTRL_EXPL
168a0 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20  AIN_STMT: {.    
168b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
168c0 70 53 74 6d 74 20 3d 20 76 61 5f 61 72 67 28 61  pStmt = va_arg(a
168d0 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  p, sqlite3_stmt*
168e0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
168f0 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20 76 61  har **pzRet = va
16900 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
16910 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20 2a 70  har**);.      *p
16920 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  zRet = sqlite3Vd
16930 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 28 56  beExplanation((V
16940 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20 20  dbe*)pStmt);.   
16950 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16960 23 65 6e 64 69 66 0a 0a 20 20 7d 0a 20 20 76 61  #endif..  }.  va
16970 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
16980 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16990 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a  BUILTIN_TEST */.
169a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
169b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
169c0 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c  utility routine,
169d0 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69   useful to VFS i
169e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20  mplementations, 
169f0 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  that checks.** t
16a00 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62  o see if a datab
16a10 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55  ase file was a U
16a20 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65  RI that containe
16a30 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65  d a specific que
16a40 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ry .** parameter
16a50 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61  , and if so obta
16a60 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
16a70 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d   the query param
16a80 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
16a90 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
16aa0 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61  nt is the filena
16ab0 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  me pointer passe
16ac0 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e  d into the xOpen
16ad0 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
16ae0 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  a VFS implementa
16af0 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61  tion.  The zPara
16b00 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  m argument is th
16b10 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
16b20 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
16b30 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20   we seek.  This 
16b40 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16b50 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
16b60 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d   zParam.** param
16b70 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74  eter if it exist
16b80 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  s.  If the param
16b90 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78  eter does not ex
16ba0 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
16bb0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e  e.** returns a N
16bc0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
16bd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
16be0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
16bf0 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
16c00 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
16c10 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20  har *zParam){.  
16c20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
16c30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
16c40 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
16c50 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
16c60 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
16c70 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
16c80 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
16c90 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
16ca0 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
16cb0 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
16cc0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
16cd0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
16ce0 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
16cf0 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
16d00 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
16d10 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
16d20 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
16d30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16d40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
16d50 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
16d60 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
16d70 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
16d80 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
16d90 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
16da0 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
16db0 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
16dc0 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
16dd0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
16de0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
16df0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
16e00 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
16e10 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
16e20 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
16e30 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
16e40 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
16e50 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
16e60 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
16e70 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
16e80 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
16e90 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
16ea0 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
16eb0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
16ec0 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
16ed0 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
16ee0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
16ef0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
16f00 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
16f10 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
16f20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
16f30 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
16f40 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
16f50 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
16f60 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
16f70 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
16f80 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
16f90 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
16fa0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
16fb0 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
16fc0 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
16fd0 26 76 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  &v, sqlite3Strle
16fe0 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
16ff0 54 46 38 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  TF8)==SQLITE_OK 
17000 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
17010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
17020 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
17030 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
17040 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
17050 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
17060 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
17070 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
17080 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
17090 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
170a0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
170b0 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
170c0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
170d0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
170e0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
170f0 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26 20  [i].pBt.     && 
17100 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  (zDbName==0 || s
17110 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
17120 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  bName, db->aDb[i
17130 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20  ].zName)==0).   
17140 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17150 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
17160 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17170 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17180 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e  Return the filen
17190 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
171a0 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
171b0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ith a database.*
171c0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
171d0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
171e0 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
171f0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
17200 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
17210 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
17220 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
17230 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
17240 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
17250 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
17260 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74  eGetFilename(pBt
17270 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) : 0;.}../*.** 
17280 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61  Return 1 if data
17290 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
172a0 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77  y or 0 if read/w
172b0 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  rite.  Return -1
172c0 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64   if.** no such d
172d0 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a  atabase exists..
172e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
172f0 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  b_readonly(sqlit
17300 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
17310 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
17320 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c  Btree *pBt = sql
17330 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
17340 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
17350 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
17360 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
17370 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 42 74 72  donly(sqlite3Btr
17380 65 65 50 61 67 65 72 28 70 42 74 29 29 20 3a 20  eePager(pBt)) : 
17390 2d 31 3b 0a 7d 0a                                -1;.}.