/ Hex Artifact Content
Login

Artifact de47c3e6b68f512b9e64ba2533ee4eecc9d501c1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1110: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1120: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1130: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
1140: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1150: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1160: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1170: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20  .  /* If SQLite 
1180: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c  is already compl
1190: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
11a0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  d, then this cal
11b0: 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  l.  ** to sqlite
11c0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73  3_initialize() s
11d0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70  hould be a no-op
11e0: 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74 69  .  But the initi
11f0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d  alization.  ** m
1200: 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e  ust be complete.
1210: 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74    So isInit must
1220: 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69   not be set unti
1230: 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20  l the very end. 
1240: 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74   ** of this rout
1250: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
1260: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1270: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
1280: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1290: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12a0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 7b 0a  ABLE_SQLLOG.  {.
12b0: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
12c0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
12d0: 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20 73  log(void);.    s
12e0: 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c  qlite3_init_sqll
12f0: 6f 67 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  og();.  }.#endif
1300: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1310: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1320: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1330: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1340: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1350: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1360: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1370: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1380: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1390: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
13a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
13b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
13c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
13d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
13e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
13f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1400: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1410: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1420: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1430: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1440: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1450: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1460: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1470: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1480: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1490: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
14a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
14b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
14c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
14d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
14e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
14f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1500: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1510: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1520: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1530: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1540: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1550: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1560: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1570: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1580: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1590: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
15a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
15b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
15c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
15d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
15e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
15f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1600: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1610: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1620: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1630: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1640: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1650: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1660: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1670: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1680: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1690: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16a0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
16b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16c0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
16d0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1700: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1710: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1720: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1730: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1750: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1760: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1770: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1780: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1790: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
17a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
17b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
17c0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
17d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
17e0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
17f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1800: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1820: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1830: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1840: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
1850: 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20  tMutex++;.  }.  
1860: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1870: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
1880: 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74   /* If rc is not
1890: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68   SQLITE_OK at th
18a0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65  is point, then e
18b0: 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63  ither the malloc
18c0: 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20  .  ** subsystem 
18d0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69  could not be ini
18e0: 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20  tialized or the 
18f0: 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f  system failed to
1900: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74   allocate.  ** t
1910: 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  he pInitMutex mu
1920: 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  tex. Return an e
1930: 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63  rror in either c
1940: 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  ase.  */.  if( r
1950: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1960: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20   }..  /* Do the 
1980: 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74  rest of the init
1990: 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72  ialization under
19a0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d   the recursive m
19b0: 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61  utex so.  ** tha
19c0: 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c  t we will be abl
19d0: 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75  e to handle recu
19e0: 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f  rsive calls into
19f0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  .  ** sqlite3_in
1a00: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65  itialize().  The
1a10: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1a20: 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74   normally come t
1a30: 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69  hrough.  ** sqli
1a40: 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68  te3_os_init() wh
1a50: 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71  en it invokes sq
1a60: 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1a70: 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a  er(), but other.
1a80: 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63    ** recursive c
1a90: 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20  alls might also 
1aa0: 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  be possible..  *
1ab0: 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
1ac0: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34  ATION-OF: R-0014
1ad0: 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61  0-37445 SQLite a
1ae0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72  utomatically ser
1af0: 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20  ializes calls.  
1b00: 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20  ** to the xInit 
1b10: 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78  method, so the x
1b20: 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64  Init method need
1b30: 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61   not be threadsa
1b40: 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  fe..  **.  ** Th
1b50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65  e following mute
1b60: 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c  x is what serial
1b70: 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74  izes access to t
1b80: 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65  he appdef pcache
1b90: 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68   xInit.  ** meth
1ba0: 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ods.  The sqlite
1bb0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
1bc0: 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20  .xInit() all is 
1bd0: 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a  embedded in the.
1be0: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
1bf0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
1c00: 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  lize()..  */.  s
1c10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1c20: 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  er(sqlite3Global
1c30: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1c40: 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
1c50: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1c60: 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74  Init==0 && sqlit
1c70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1c80: 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a  nProgress==0 ){.
1c90: 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20      FuncDefHash 
1ca0: 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c  *pHash = &GLOBAL
1cb0: 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71  (FuncDefHash, sq
1cc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74  lite3GlobalFunct
1cd0: 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  ions);.    sqlit
1ce0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1cf0: 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20  nProgress = 1;. 
1d00: 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c     memset(pHash,
1d10: 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74   0, sizeof(sqlit
1d20: 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  e3GlobalFunction
1d30: 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s));.    sqlite3
1d40: 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75  RegisterGlobalFu
1d50: 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69  nctions();.    i
1d60: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1d70: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1d80: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
1d90: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
1da0: 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  heInitialize();.
1db0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1dc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1de0: 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68  alConfig.isPCach
1df0: 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  eInit = 1;.     
1e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49   rc = sqlite3OsI
1e10: 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nit();.    }.   
1e20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1e40: 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53  te3PCacheBufferS
1e50: 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f  etup( sqlite3Glo
1e60: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c  balConfig.pPage,
1e70: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
1e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e90: 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47  szPage, sqlite3G
1ea0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
1eb0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1ec0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1ed0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Init = 1;.    }.
1ee0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1ef0: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
1f00: 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ss = 0;.  }.  sq
1f10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1f20: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
1f30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1f40: 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b  );..  /* Go back
1f50: 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74 69   under the stati
1f60: 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61  c mutex and clea
1f70: 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73 69  n up the recursi
1f80: 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f  ve.  ** mutex to
1f90: 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75   prevent a resou
1fa0: 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20  rce leak..  */. 
1fb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fc0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
1fd0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fe0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1ff0: 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69  ex--;.  if( sqli
2000: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2010: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30  nRefInitMutex<=0
2020: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2030: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2040: 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65  fig.nRefInitMute
2050: 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
2060: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73  te3_mutex_free(s
2070: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2080: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
2090: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20a0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
20b0: 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ex = 0;.  }.  sq
20c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20d0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
20e0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
20f0: 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79  is just a sanity
2100: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
2110: 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20  ure SQLite has. 
2120: 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65   ** been compile
2130: 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74  d correctly.  It
2140: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
2150: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20   run this code, 
2160: 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  but.  ** we don'
2170: 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74  t want to run it
2180: 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73   too often and s
2190: 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65  oak up CPU cycle
21a0: 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65  s for no.  ** re
21b0: 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e  ason.  So we run
21c0: 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20   it once during 
21d0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
21e0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
21f0: 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  BUG.#ifndef SQLI
2200: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
2210: 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73  _POINT.  /* This
2220: 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65   section of code
2230: 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22  's only "output"
2240: 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28 29   is via assert()
2250: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a   statements. */.
2260: 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54    if ( rc==SQLIT
2270: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20  E_OK ){.    u64 
2280: 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36  x = (((u64)1)<<6
2290: 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65  3)-1;.    double
22a0: 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73   y;.    assert(s
22b0: 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20  izeof(x)==8);.  
22c0: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
22d0: 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a  x)==sizeof(y));.
22e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26      memcpy(&y, &
22f0: 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72  x, 8);.    asser
2300: 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  t( sqlite3IsNaN(
2310: 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  y) );.  }.#endif
2320: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
2330: 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2340: 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75  ation steps requ
2350: 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51 4c  ested by the SQL
2360: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
2370: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   ** compile-time
2380: 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69   option..  */.#i
2390: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d  A_INIT.  if( rc=
23b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
23c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23d0: 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  g.isInit ){.    
23e0: 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41  int SQLITE_EXTRA
23f0: 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72  _INIT(const char
2400: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  *);.    rc = SQL
2410: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30  ITE_EXTRA_INIT(0
2420: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2430: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2440: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
2450: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
2460: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
2470: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
2480: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
2490: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
24a0: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
24b0: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
24c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
24d0: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
24e0: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
24f0: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
2500: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
2510: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2520: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
2530: 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61  e.  But it is sa
2540: 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  fe to invoke thi
2550: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20  s routine.** on 
2560: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61  when SQLite is a
2570: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
2580: 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  .  If SQLite is 
2590: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
25a0: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  n.** when this r
25b0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
25c0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
25d0: 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
25e0: 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74  ss no-op..*/.int
25f0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2600: 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73  n(void){.  if( s
2610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2620: 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  ig.isInit ){.#if
2630: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2640: 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f  _SHUTDOWN.    vo
2650: 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  id SQLITE_EXTRA_
2660: 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a  SHUTDOWN(void);.
2670: 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41      SQLITE_EXTRA
2680: 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e  _SHUTDOWN();.#en
2690: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
26a0: 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71  os_end();.    sq
26b0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f  lite3_reset_auto
26c0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20  _extension();.  
26d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
26e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30  onfig.isInit = 0
26f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2700: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2710: 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a  isPCacheInit ){.
2720: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2730: 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20  eShutdown();.   
2740: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2750: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2760: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2770: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2780: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2790: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
27a0: 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20  MallocEnd();.   
27b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
27c0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
27d0: 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t = 0;..#ifndef 
27e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54  SQLITE_OMIT_SHUT
27f0: 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53  DOWN_DIRECTORIES
2800: 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70  .    /* The heap
2810: 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e   subsystem has n
2820: 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e  ow been shutdown
2830: 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65   and these value
2840: 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20  s are supposed. 
2850: 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c     ** to be NULL
2860: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
2870: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62 74  ory that was obt
2880: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2890: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20  e3_malloc(),.   
28a0: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
28b0: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
28c0: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
28d0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
28e0: 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76  e these.    ** v
28f0: 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66  alues cannot ref
2900: 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72  er to heap memor
2910: 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  y that was just 
2920: 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
2930: 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70   the.    ** heap
2940: 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20 73   subsystem was s
2950: 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69  hutdown.  This i
2960: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74  s only done if t
2970: 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20  he current call 
2980: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  to.    ** this f
2990: 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64  unction resulted
29a0: 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75 62   in the heap sub
29b0: 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20  system actually 
29c0: 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a  being shutdown..
29d0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
29e0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
29f0: 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
2a00: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2a10: 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 0;.#endif.  
2a20: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2a30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2a40: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2a50: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2a60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2a70: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2a80: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
2a90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aa0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2ab0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
2ac0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
2ad0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2ae0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2af0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2b00: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2b10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2b20: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2b30: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2b40: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2b50: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2b60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2b70: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2b80: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
2b90: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
2ba0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
2bb0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
2bc0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
2bd0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2be0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2bf0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2c00: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
2c10: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2c20: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
2c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
2c40: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
2c50: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
2c60: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
2c70: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
2c80: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
2c90: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
2ca0: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
2cb0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2cc0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
2cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2ce0: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
2cf0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
2d00: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
2d10: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
2d20: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2d30: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
2d40: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
2d50: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
2d60: 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66  ile. .    */.#if
2d70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2d80: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
2d90: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2da0: 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
2db0: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
2dc0: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
2dd0: 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d  /* Disable all m
2de0: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2df0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2e00: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2e10: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
2e20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2e30: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2e40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e50: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2e60: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
2e70: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2e80: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e   Disable mutexin
2e90: 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  g of database co
2ea0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
2eb0: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74     /* Enable mut
2ec0: 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61  exing of core da
2ed0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
2ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2f00: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2f10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f20: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2f30: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2f50: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2f60: 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ERIALIZED: {.   
2f70: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c     /* Enable all
2f80: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
2f90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2fa0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2fb0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2fc0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fd0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
2fe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ff0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3000: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58  ITE_CONFIG_MUTEX
3010: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
3020: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
3030: 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ive mutex implem
3040: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3050: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3060: 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76  onfig.mutex = *v
3070: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3080: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a  3_mutex_methods*
3090: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
30a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
30b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
30c0: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
30d0: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
30e0: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
30f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
3100: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3110: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
3120: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
3130: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3140: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
3150: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3160: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3170: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3180: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
3190: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
31a0: 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  ve malloc implem
31b0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
31c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
31d0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72  onfig.m = *va_ar
31e0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
31f0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  m_methods*);.   
3200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3210: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3220: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
3230: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
3240: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
3250: 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65  t malloc() imple
3260: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
3270: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3280: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
3290: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
32a0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
32b0: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
32c0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
32d0: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
32e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
32f0: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
3300: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3310: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
3320: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
3330: 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  /* Enable or dis
3340: 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  able the malloc 
3350: 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f  status collectio
3360: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
3370: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3380: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
3390: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
33a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
33b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
33c0: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a  NFIG_SCRATCH: {.
33d0: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
33e0: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
33f0: 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73  scratch memory s
3400: 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  pace */.      sq
3410: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3420: 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.pScratch = va_
3430: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3450: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
3460: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
3470: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3480: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3490: 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .nScratch = va_a
34a0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
34b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
34c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
34d0: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
34e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
34f0: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
3500: 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d  for page cache m
3510: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3530: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d  alConfig.pPage =
3540: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3550: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
3570: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
3580: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3590: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
35a0: 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67  g.nPage = va_arg
35b0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
35c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
35d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
35e0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
35f0: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3600: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3610: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3620: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3630: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3640: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3650: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3660: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3690: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
36a0: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
36b0: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
36c0: 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c   page cache impl
36d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
36e0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
36f0: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20  lConfig.pcache2 
3700: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
3710: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3720: 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62  hods2*);.      b
3730: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3740: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3750: 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b  IG_GETPCACHE2: {
3760: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3770: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3780: 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20  cache2.xInit==0 
3790: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
37a0: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
37b0: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
37c0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
37d0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
37e0: 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69  ethods2*) = sqli
37f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3800: 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62  pcache2;.      b
3810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
3820: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3830: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
3840: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3850: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3860: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
3870: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
3880: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
3890: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
38a0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
38b0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
38c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
38d0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
38e0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
38f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3900: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
3910: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3920: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3930: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3940: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3950: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
3980: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3990: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
39a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
39b0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
39c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
39d0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
39e0: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
39f0: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
3a00: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
3a10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3a20: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
3a30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
3a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3a50: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
3a60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
3a70: 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72  the heap pointer
3a80: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
3a90: 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f  estore the mallo
3aa0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
3ab0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
3ac0: 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72   to NULL pointer
3ad0: 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c  s too.  This wil
3ae0: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c  l cause the mall
3af0: 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20  oc to go.       
3b00: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
3b10: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
3b20: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
3b30: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
3b40: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   is.        ** r
3b50: 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  un..        */. 
3b60: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
3b70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3b80: 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ig.m, 0, sizeof(
3b90: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3ba0: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
3bb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
3bc0: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
3bd0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
3be0: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
3bf0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
3c00: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
3c10: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
3c20: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
3c30: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
3c40: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
3c50: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
3c60: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
3c70: 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
3c80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3c90: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
3ca0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cb0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
3cc0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
3cd0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3ce0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
3cf0: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
3d00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3d10: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
3d20: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
3d30: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
3d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3d50: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3d60: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
3d70: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
3d80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3d90: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
3da0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3dc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
3dd0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3de0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3e00: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
3e10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3e20: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69  e logger funccti
3e30: 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74  on and its first
3e40: 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a   argument..    *
3e50: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73  * The default is
3e60: 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20   NULL.  Logging 
3e70: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
3e80: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
3e90: 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  ter is.    ** NU
3ea0: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
3eb0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3ec0: 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f  G_LOG: {.      /
3ed0: 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
3ee0: 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
3ef0: 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
3f00: 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
3f10: 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
3f20: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
3f30: 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
3f40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3f50: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3f60: 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  (ap, void(*)(voi
3f70: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
3f80: 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  r*));.      */. 
3f90: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
3fa0: 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  d(*LOGFUNC_t)(vo
3fb0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3fc0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
3fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3fe0: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
3ff0: 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20  , LOGFUNC_t);.  
4000: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4010: 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20  lConfig.pLogArg 
4020: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4030: 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d*);.      break
4040: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
4050: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4060: 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  URI: {.      sql
4070: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4080: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
4090: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
40a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
40b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
40c0: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
40d0: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
40e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
40f0: 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
4100: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4110: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
4120: 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
4130: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
4140: 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c  LOG.    case SQL
4150: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
4160: 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  G: {.      typed
4170: 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46  ef void(*SQLLOGF
4180: 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71  UNC_t)(void*, sq
4190: 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
41a0: 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  ar*, int);.     
41b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
41c0: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76  nfig.xSqllog = v
41d0: 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47  a_arg(ap, SQLLOG
41e0: 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73  FUNC_t);.      s
41f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4200: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20  ig.pSqllogArg = 
4210: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20  va_arg(ap, void 
4220: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4230: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4240: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4250: 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a  ONFIG_MMAP_SIZE:
4260: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4270: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d 20  _int64 szMmap = 
4280: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4290: 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20  e3_int64);.     
42a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
42b0: 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61  xMmap = va_arg(a
42c0: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
42d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 4d  );.      if( mxM
42e0: 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e  map<0 || mxMmap>
42f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4300: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
4310: 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  mxMmap = SQLITE_
4320: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20  MAX_MMAP_SIZE;. 
4330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4340: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4350: 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70  .mxMmap = mxMmap
4360: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
4370: 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20  ap<0 ) szMmap = 
4380: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
4390: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
43a0: 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61  if( szMmap>mxMma
43b0: 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d  p) szMmap = mxMm
43c0: 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ap;.      sqlite
43d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
43e0: 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20  Mmap = szMmap;. 
43f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4400: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
4410: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
4420: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
4430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4440: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
4450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4460: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
4470: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
4480: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
4490: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
44a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
44b0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
44c0: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
44d0: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
44e0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
44f0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
4500: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
4510: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
4520: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
4530: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
4540: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
4550: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
4560: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
4570: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
4580: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
4590: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
45a0: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
45b0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
45c0: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
45d0: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
45e0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
45f0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
4600: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
4610: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
4620: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
4630: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
4640: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
4650: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
4660: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76  z, int cnt){.  v
4670: 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69  oid *pStart;.  i
4680: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4690: 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  .nOut ){.    ret
46a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
46b0: 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61  .  }.  /* Free a
46c0: 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b  ny existing look
46d0: 61 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72  aside buffer for
46e0: 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66   this handle bef
46f0: 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ore.  ** allocat
4700: 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f  ing a new one so
4710: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74   we don't have t
4720: 6f 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72  o have space for
4730: 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74   .  ** both at t
4740: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
4750: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
4760: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
4770: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4780: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
4790: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
47a0: 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66    /* The size of
47b0: 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f   a lookaside slo
47c0: 74 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57  t after ROUNDDOW
47d0: 4e 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  N8 needs to be l
47e0: 61 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  arger.  ** than 
47f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  a pointer to be 
4800: 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73  useful..  */.  s
4810: 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73  z = ROUNDDOWN8(s
4820: 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  z);  /* IMP: R-3
4830: 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20  3038-09382 */.  
4840: 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a  if( sz<=(int)siz
4850: 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f  eof(LookasideSlo
4860: 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20  t*) ) sz = 0;.  
4870: 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20  if( cnt<0 ) cnt 
4880: 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30  = 0;.  if( sz==0
4890: 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   || cnt==0 ){.  
48a0: 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53    sz = 0;.    pS
48b0: 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tart = 0;.  }els
48c0: 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b  e if( pBuf==0 ){
48d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
48e0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
48f0: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71  .    pStart = sq
4900: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a  lite3Malloc( sz*
4910: 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  cnt );  /* IMP: 
4920: 52 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f  R-61949-35727 */
4930: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
4940: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
4950: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20     if( pStart ) 
4960: 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  cnt = sqlite3Mal
4970: 6c 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f  locSize(pStart)/
4980: 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sz;.  }else{.   
4990: 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a   pStart = pBuf;.
49a0: 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73    }.  db->lookas
49b0: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74  ide.pStart = pSt
49c0: 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  art;.  db->looka
49d0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
49e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
49f0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
4a00: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
4a10: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
4a20: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
4a30: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
4a40: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
4a50: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
4a60: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4a70: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
4a80: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
4a90: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
4aa0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
4ab0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
4ac0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
4ad0: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b  aside.pFree = p;
4ae0: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
4af0: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
4b00: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
4b10: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4b20: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
4b30: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
4b40: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  nabled = 1;.    
4b50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
4b60: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
4b70: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
4b80: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4b90: 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  de.pEnd = 0;.   
4ba0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4bb0: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20  Enabled = 0;.   
4bc0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4bd0: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
4be0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4bf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
4c00: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
4c10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4c20: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
4c30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
4c40: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
4c50: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
4c60: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
4c70: 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f   db->mutex;.}../
4c80: 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20  *.** Free up as 
4c90: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77  much memory as w
4ca0: 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67  e can from the g
4cb0: 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  iven database.**
4cc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4cd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  int sqlite3_db_r
4ce0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71  elease_memory(sq
4cf0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
4d00: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  t i;.  sqlite3_m
4d10: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
4d20: 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
4d30: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
4d40: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4d50: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4d60: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
4d70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
4d80: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
4d90: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
4da0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
4db0: 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
4dc0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
4dd0: 68 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20  hrink(pPager);. 
4de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4df0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
4e00: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
4e10: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
4e20: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
4e30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4e40: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
4e50: 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61  n settings for a
4e60: 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74  n individual dat
4e70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
4e80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
4e90: 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65  db_config(sqlite
4ea0: 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e  3 *db, int op, .
4eb0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
4ec0: 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  p;.  int rc;.  v
4ed0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
4ee0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
4ef0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f00: 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  _DBCONFIG_LOOKAS
4f10: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  IDE: {.      voi
4f20: 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67  d *pBuf = va_arg
4f30: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20  (ap, void*); /* 
4f40: 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39  IMP: R-26835-109
4f50: 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  64 */.      int 
4f60: 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
4f70: 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49  int);       /* I
4f80: 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39  MP: R-47871-2599
4f90: 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  4 */.      int c
4fa0: 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nt = va_arg(ap, 
4fb0: 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d  int);      /* IM
4fc0: 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36  P: R-04460-53386
4fd0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
4fe0: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
4ff0: 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29  , pBuf, sz, cnt)
5000: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5010: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
5020: 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
5030: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
5040: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20          int op; 
5050: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
5060: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  de */.        u3
5070: 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61  2 mask;    /* Ma
5080: 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e  sk of the bit in
5090: 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74   sqlite3.flags t
50a0: 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20  o set/clear */. 
50b0: 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d       } aFlagOp[]
50c0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53   = {.        { S
50d0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
50e0: 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53  NABLE_FKEY,    S
50f0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
5100: 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  s    },.        
5110: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
5120: 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
5130: 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  , SQLITE_EnableT
5140: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
5150: 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   };.      unsign
5160: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20  ed int i;.      
5170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5180: 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37  R; /* IMP: R-427
5190: 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20  90-23372 */.    
51a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
51b0: 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b  aySize(aFlagOp);
51c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
51d0: 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70  f( aFlagOp[i].op
51e0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ==op ){.        
51f0: 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61    int onoff = va
5200: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5210: 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52           int *pR
5220: 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  es = va_arg(ap, 
5230: 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20  int*);.         
5240: 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20   int oldFlags = 
5250: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  db->flags;.     
5260: 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30       if( onoff>0
5270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5280: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c  db->flags |= aFl
5290: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
52a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
52b0: 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20  ( onoff==0 ){.  
52c0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
52d0: 61 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b  ags &= ~aFlagOp[
52e0: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
52f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
5300: 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d  f( oldFlags!=db-
5310: 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  >flags ){.      
5320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5330: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
5340: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  ments(db);.     
5350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5360: 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20   if( pRes ){.   
5370: 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
5380: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46   (db->flags & aF
5390: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d  lagOp[i].mask)!=
53a0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
53b0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
53c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
53d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
53e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
53f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5400: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
5410: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5420: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5430: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
5440: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
5450: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
5460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
5470: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
5480: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
5490: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
54a0: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
54b0: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
54c0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
54d0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
54e0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
54f0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
5500: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
5510: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
5520: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
5530: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
5540: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
5550: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
5560: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
5570: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
5580: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
5590: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
55a0: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
55b0: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
55c0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
55d0: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
55e0: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
55f0: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
5600: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
5610: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
5620: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
5630: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
5640: 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d   nKey2;.  rc = m
5650: 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
5660: 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
5670: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
5680: 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61  adFlag.     && a
5690: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
56a0: 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31  )pKey1)+n, nKey1
56b0: 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  -n).     && allS
56c0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
56d0: 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29  ey2)+n, nKey2-n)
56e0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
56f0: 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e   Leave rc unchan
5700: 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20  ged at 0 */.    
5710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
5720: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
5730: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5740: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5750: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
5760: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
5770: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
5780: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
5790: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
57a0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
57b0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
57c0: 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d  dependant.** com
57d0: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
57e0: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
57f0: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
5800: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
5810: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
5820: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
5830: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
5840: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
5850: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
5860: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
5870: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
5880: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
5890: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
58a0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
58b0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
58c0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
58d0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
58e0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
58f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5900: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
5910: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
5920: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
5930: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
5940: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
5950: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
5960: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
5970: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
5980: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
5990: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
59a0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
59b0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
59c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
59d0: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
59e0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
59f0: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
5a00: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
5a10: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
5a20: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
5a30: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
5a40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5a50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
5a60: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
5a70: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
5a80: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
5a90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
5aa0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
5ab0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
5ac0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
5ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5ae0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
5af0: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
5b00: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
5b10: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
5b20: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
5b30: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
5b40: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  {.  return db->n
5b50: 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a  TotalChange;.}..
5b60: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
5b70: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
5b80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
5b90: 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20  nly manipulates 
5ba0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a  fields of the.**
5bb0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
5bc0: 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73   object, it does
5bd0: 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73   not close any s
5be0: 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d  avepoints that m
5bf0: 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74  ay be open.** at
5c00: 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65   the b-tree/page
5c10: 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64  r level..*/.void
5c20: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
5c30: 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20  epoints(sqlite3 
5c40: 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64  *db){.  while( d
5c50: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  b->pSavepoint ){
5c60: 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  .    Savepoint *
5c70: 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65  pTmp = db->pSave
5c80: 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70  point;.    db->p
5c90: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
5ca0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
5cb0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5cc0: 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Tmp);.  }.  db->
5cd0: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
5ce0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
5cf0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72   = 0;.  db->isTr
5d00: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
5d10: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
5d20: 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   Invoke the dest
5d30: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
5d40: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5d50: 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e  FuncDef p, if an
5d60: 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66  y. Except,.** if
5d70: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
5d80: 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68   last copy of th
5d90: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e  e function, do n
5da0: 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75  ot invoke it. Mu
5db0: 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73  ltiple.** copies
5dc0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e   of a single fun
5dd0: 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65  ction are create
5de0: 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75  d when create_fu
5df0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c  nction() is call
5e00: 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  ed.** with SQLIT
5e10: 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63  E_ANY as the enc
5e20: 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  oding..*/.static
5e30: 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65   void functionDe
5e40: 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64  stroy(sqlite3 *d
5e50: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a  b, FuncDef *p){.
5e60: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
5e70: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20   *pDestructor = 
5e80: 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a  p->pDestructor;.
5e90: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
5ea0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
5eb0: 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ctor->nRef--;.  
5ec0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
5ed0: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
5ee0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
5ef0: 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72  >xDestroy(pDestr
5f00: 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61  uctor->pUserData
5f10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5f20: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74  DbFree(db, pDest
5f30: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
5f40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63   }.}../*.** Disc
5f50: 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74  onnect all sqlit
5f60: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20  e3_vtab objects 
5f70: 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64  that belong to d
5f80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5f90: 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69  on.** db. This i
5fa0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62  s called when db
5fb0: 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64   is being closed
5fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5fd0: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
5fe0: 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ab(sqlite3 *db){
5ff0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6000: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6010: 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  E.  int i;.  sql
6020: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
6030: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
6040: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
6050: 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ){.    Schema *p
6060: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
6070: 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [i].pSchema;.   
6080: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
6090: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
60a0: 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20   HashElem *p;.  
60b0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
60c0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
60d0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b  ma->tblHash); p;
60e0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
60f0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(p)){.        T
6100: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61  able *pTab = (Ta
6110: 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ble *)sqliteHash
6120: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20  Data(p);.       
6130: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
6140: 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74  Tab) ) sqlite3Vt
6150: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
6160: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a   pTab);.      }.
6170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
6180: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
6190: 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  (db);.#else.  UN
61a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
61b0: 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  b);.#endif.}../*
61c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
61d0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
61e0: 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e  ection db has un
61f0: 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72  finalized prepar
6200: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ed.** statements
6210: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73   or unfinished s
6220: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
6230: 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74  jects.  .*/.stat
6240: 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  ic int connectio
6250: 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20  nIsBusy(sqlite3 
6260: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  *db){.  int j;. 
6270: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6280: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
6290: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
62a0: 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75  db->pVdbe ) retu
62b0: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  rn 1;.  for(j=0;
62c0: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
62d0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
62e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42   = db->aDb[j].pB
62f0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
6300: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
6310: 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20  InBackup(pBt) ) 
6320: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
6330: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6340: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73  ** Close an exis
6350: 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61  ting SQLite data
6360: 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  base.*/.static i
6370: 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28  nt sqlite3Close(
6380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6390: 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20   forceZombie){. 
63a0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
63d0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
63e0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
63f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6400: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
6410: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
6420: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6430: 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20  x);..  /* Force 
6440: 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c  xDisconnect call
6450: 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  s on all virtual
6460: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73   tables */.  dis
6470: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64  connectAllVtab(d
6480: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  b);..  /* If a t
6490: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
64a0: 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  en, the disconne
64b0: 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c  ctAllVtab() call
64c0: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
64d0: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
64e0: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
64f0: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
6500: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
6510: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
6520: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
6530: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
6540: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6550: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
6560: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
6570: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
6580: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
6590: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
65a0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
65b0: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
65c0: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
65d0: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
65e0: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
65f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
6600: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
6610: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
6620: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
6630: 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
6640: 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  r (sqlite3_close
6650: 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20  () behavior) is 
6660: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
6670: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
6680: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
6690: 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69   not be closed i
66a0: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
66b0: 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d  .  if( !forceZom
66c0: 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f  bie && connectio
66d0: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
66e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
66f0: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
6700: 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73   "unable to clos
6710: 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c  e due to unfinal
6720: 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22 73  ized ".       "s
6730: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
6740: 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73 22  inished backups"
6750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
6760: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
6770: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
6780: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6790: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
67a0: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
67b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
67c0: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
67d0: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  g ){.    /* Clos
67e0: 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20  ing the handle. 
67f0: 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
6800: 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20 76   is passed the v
6810: 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73  alue 2. */.    s
6820: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
6830: 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74  ig.xSqllog(sqlit
6840: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
6850: 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30  SqllogArg, db, 0
6860: 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 2);.  }.#endif
6870: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
6880: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  he connection in
6890: 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20  to a zombie and 
68a0: 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20  then close it.. 
68b0: 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   */.  db->magic 
68c0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  = SQLITE_MAGIC_Z
68d0: 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33  OMBIE;.  sqlite3
68e0: 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f  LeaveMutexAndClo
68f0: 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20  seZombie(db);.  
6900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76  ;.}../*.** Two v
6920: 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65  ariations on the
6930: 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63   public interfac
6940: 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20  e for closing a 
6950: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
6960: 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69  ection. The sqli
6970: 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73  te3_close() vers
6980: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
6990: 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c  TE_BUSY and.** l
69a0: 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63  eaves the connec
69b0: 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74  tion option if t
69c0: 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c  here are unfinal
69d0: 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a  ized prepared.**
69e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75   statements or u
69f0: 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65  nfinished sqlite
6a00: 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20  3_backups.  The 
6a10: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
6a20: 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f  ().** version fo
6a30: 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  rces the connect
6a40: 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ion to become a 
6a50: 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65 20  zombie if there 
6a60: 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20  are.** unclosed 
6a70: 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61  resources, and a
6a80: 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c  rranges for deal
6a90: 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68  location when th
6aa0: 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72  e last.** prepar
6ab0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  e statement or s
6ac0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c  qlite3_backup cl
6ad0: 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oses..*/.int sql
6ae0: 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74  ite3_close(sqlit
6af0: 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20  e3 *db){ return 
6b00: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c  sqlite3Close(db,
6b10: 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0); }.int sqlite
6b20: 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74  3_close_v2(sqlit
6b30: 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20  e3 *db){ return 
6b40: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c  sqlite3Close(db,
6b50: 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  1); }.../*.** Cl
6b60: 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  ose the mutex on
6b70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6b80: 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46  tion db..**.** F
6b90: 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64  urthermore, if d
6ba0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6bb0: 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69  on db is a zombi
6bc0: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
6bd0: 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65  there.** has bee
6be0: 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  n a prior call t
6bf0: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  o sqlite3_close(
6c00: 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63  db) or sqlite3_c
6c10: 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64  lose_v2(db)) and
6c20: 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65  .** every sqlite
6c30: 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62  3_stmt has now b
6c40: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
6c50: 64 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  d every sqlite3_
6c60: 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69  backup has.** fi
6c70: 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65  nished, then fre
6c80: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
6c90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6ca0: 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f  LeaveMutexAndClo
6cb0: 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33  seZombie(sqlite3
6cc0: 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65   *db){.  HashEle
6cd0: 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20  m *i;           
6ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
6cf0: 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20   table iterator 
6d00: 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f  */.  int j;..  /
6d10: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
6d20: 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74  utstanding sqlit
6d30: 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74  e3_stmt or sqlit
6d40: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6d50: 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65  s.  ** or if the
6d60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
6d70: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f  not yet been clo
6d80: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  sed by sqlite3_c
6d90: 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20  lose_v2(),.  ** 
6da0: 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20  then just leave 
6db0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65  the mutex and re
6dc0: 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
6dd0: 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49   db->magic!=SQLI
6de0: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20  TE_MAGIC_ZOMBIE 
6df0: 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  || connectionIsB
6e00: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6e10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6e20: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6e30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
6e40: 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
6e50: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
6e60: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64  means that the d
6e70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6e80: 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73  on has.  ** clos
6e90: 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  ed all sqlite3_s
6ea0: 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  tmt and sqlite3_
6eb0: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61  backup objects a
6ec0: 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a  nd has been.  **
6ed0: 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
6ee0: 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e  e3_close (meanin
6ef0: 67 20 74 68 61 74 20 69 74 20 69 73 20 61 20 7a  g that it is a z
6f00: 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f  ombie).  Therefo
6f10: 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61  re,.  ** go ahea
6f20: 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72  d and free all r
6f30: 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a  esources..  */..
6f40: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75    /* Free any ou
6f50: 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f  tstanding Savepo
6f60: 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20  int structures. 
6f70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  */.  sqlite3Clos
6f80: 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
6f90: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
6fa0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6fb0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a  tions */.  for(j
6fc0: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
6fd0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
6fe0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
6ff0: 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[j];.    if( p
7000: 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Db->pBt ){.     
7010: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
7020: 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  se(pDb->pBt);.  
7030: 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30      pDb->pBt = 0
7040: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31  ;.      if( j!=1
7050: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
7060: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
7070: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7080: 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54    /* Clear the T
7090: 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72  EMP schema separ
70a0: 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a  ately and last *
70b0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /.  if( db->aDb[
70c0: 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
70d0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
70e0: 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  lear(db->aDb[1].
70f0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
7100: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
7110: 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  kList(db);..  /*
7120: 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72   Free up the arr
7130: 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  ay of auxiliary 
7140: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73  databases */.  s
7150: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
7160: 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b  tabaseArray(db);
7170: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
7180: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
7190: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
71a0: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20  aDbStatic );..  
71b0: 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65  /* Tell the code
71c0: 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61   in notify.c tha
71d0: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
71e0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73   no longer holds
71f0: 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20   any.  ** locks 
7200: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  and does not req
7210: 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72  uire any further
7220: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
7230: 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
7240: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
7250: 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20  onClosed(db);.. 
7260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
7270: 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e  ySize(db->aFunc.
7280: 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75  a); j++){.    Fu
7290: 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70  ncDef *pNext, *p
72a0: 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f  Hash, *p;.    fo
72b0: 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b  r(p=db->aFunc.a[
72c0: 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b  j]; p; p=pHash){
72d0: 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d 20 70  .      pHash = p
72e0: 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77  ->pHash;.      w
72f0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20  hile( p ){.     
7300: 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72     functionDestr
7310: 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  oy(db, p);.     
7320: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
7330: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
7340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7350: 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  );.        p = p
7360: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
7370: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
7380: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
7390: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20  &db->aCollSeq); 
73a0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
73b0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c  ext(i)){.    Col
73c0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43  lSeq *pColl = (C
73d0: 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48  ollSeq *)sqliteH
73e0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
73f0: 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65  /* Invoke any de
7400: 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74  structors regist
7410: 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69  ered for collati
7420: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72  on sequence user
7430: 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f   data. */.    fo
7440: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
7450: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  {.      if( pCol
7460: 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20  l[j].xDel ){.   
7470: 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44       pColl[j].xD
7480: 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65  el(pColl[j].pUse
7490: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
74a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
74b0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a  ree(db, pColl);.
74c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
74d0: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c  hClear(&db->aCol
74e0: 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
74f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7500: 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d  ALTABLE.  for(i=
7510: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
7520: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69  &db->aModule); i
7530: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
7540: 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(i)){.    Modu
7550: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
7560: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
7570: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
7580: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29  pMod->xDestroy )
7590: 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44  {.      pMod->xD
75a0: 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75  estroy(pMod->pAu
75b0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  x);.    }.    sq
75c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
75d0: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
75e0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
75f0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
7600: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
7610: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
7620: 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  K, 0); /* Deallo
7630: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
7640: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
7650: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72  */.  if( db->pEr
7660: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
7670: 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45  ValueFree(db->pE
7680: 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rr);.  }.  sqlit
7690: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
76a0: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
76b0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
76c0: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
76d0: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
76e0: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
76f0: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
7700: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
7710: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
7720: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
7730: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
7740: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
7750: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
7760: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
7770: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
7780: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
7790: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
77a0: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
77b0: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
77c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
77d0: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
77e0: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
77f0: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
7800: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
7810: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7820: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
7830: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
7840: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7850: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
7860: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
7870: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
7880: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
7890: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
78a0: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
78b0: 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f  de.nOut==0 );  /
78c0: 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f  * Fails on a loo
78d0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65  kaside memory le
78e0: 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ak */.  if( db->
78f0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
7900: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
7910: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
7920: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
7930: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
7940: 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(db);.}../*.** 
7950: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
7960: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66  abase files.  If
7970: 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
7980: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
7990: 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  .** any open cur
79a0: 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
79b0: 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20  ated ("tripped" 
79c0: 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e  - as in "trippin
79d0: 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62  g a circuit.** b
79e0: 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64  reaker") and mad
79f0: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70  e to return trip
7a00: 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72  Code if there ar
7a10: 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a  e any further.**
7a20: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65   attempts to use
7a30: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f   that cursor..*/
7a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
7a50: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
7a60: 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f   *db, int tripCo
7a70: 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  de){.  int i;.  
7a80: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
7a90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7aa0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
7ab0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
7ac0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
7ad0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  Malloc();.  for(
7ae0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7af0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
7b00: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
7b10: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
7b20: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7b30: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7b40: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
7b50: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
7b60: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7b70: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
7b80: 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
7b90: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69      db->aDb[i].i
7ba0: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20  nTrans = 0;.    
7bb0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
7bc0: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
7bd0: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
7be0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
7bf0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53  if( (db->flags&S
7c00: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
7c10: 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  ges)!=0 && db->i
7c20: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
7c30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
7c40: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
7c50: 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ts(db);.    sqli
7c60: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
7c70: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
7c80: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e  b);.  }..  /* An
7c90: 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  y deferred const
7ca0: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
7cb0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
7cc0: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62  esolved. */.  db
7cd0: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
7ce0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  = 0;..  /* If on
7cf0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
7d00: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
7d10: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
7d20: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
7d30: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
7d40: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
7d50: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
7d60: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
7d70: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
7d80: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
7d90: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
7da0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
7db0: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
7dc0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
7dd0: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
7de0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
7df0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
7e00: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
7e10: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
7e20: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
7e30: 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67  char* const aMsg
7e40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51  [] = {.    /* SQ
7e50: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
7e60: 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f   */ "not an erro
7e70: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
7e80: 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f  E_ERROR       */
7e90: 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   "SQL logic erro
7ea0: 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74  r or missing dat
7eb0: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
7ec0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20  QLITE_INTERNAL  
7ed0: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
7ee0: 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20  QLITE_PERM      
7ef0: 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72    */ "access per
7f00: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c  mission denied",
7f10: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
7f20: 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63  BORT       */ "c
7f30: 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65  allback requeste
7f40: 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a  d query abort",.
7f50: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55      /* SQLITE_BU
7f60: 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  SY        */ "da
7f70: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
7f80: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7f90: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20  _LOCKED      */ 
7fa0: 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
7fb0: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
7fc0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  /* SQLITE_NOMEM 
7fd0: 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66        */ "out of
7fe0: 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a   memory",.    /*
7ff0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
8000: 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20      */ "attempt 
8010: 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f  to write a reado
8020: 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20  nly database",. 
8030: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
8040: 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74  ERRUPT   */ "int
8050: 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f  errupted",.    /
8060: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20  * SQLITE_IOERR  
8070: 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f       */ "disk I/
8080: 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  O error",.    /*
8090: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
80a0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
80b0: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
80c0: 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f  alformed",.    /
80d0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  * SQLITE_NOTFOUN
80e0: 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e  D    */ "unknown
80f0: 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20   operation",.   
8100: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   /* SQLITE_FULL 
8110: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
8120: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
8130: 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ull",.    /* SQL
8140: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20  ITE_CANTOPEN    
8150: 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  */ "unable to op
8160: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
8170: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
8180: 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20  _PROTOCOL    */ 
8190: 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f  "locking protoco
81a0: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
81b0: 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f  E_EMPTY       */
81c0: 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73   "table contains
81d0: 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f   no data",.    /
81e0: 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  * SQLITE_SCHEMA 
81f0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
8200: 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61  e schema has cha
8210: 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nged",.    /* SQ
8220: 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20  LITE_TOOBIG     
8230: 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62   */ "string or b
8240: 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20  lob too big",.  
8250: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53    /* SQLITE_CONS
8260: 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73  TRAINT  */ "cons
8270: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a  traint failed",.
8280: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
8290: 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61  SMATCH    */ "da
82a0: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22  tatype mismatch"
82b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
82c0: 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22  MISUSE      */ "
82d0: 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20  library routine 
82e0: 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65  called out of se
82f0: 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20  quence",.    /* 
8300: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20  SQLITE_NOLFS    
8310: 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c     */ "large fil
8320: 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73  e support is dis
8330: 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  abled",.    /* S
8340: 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20  QLITE_AUTH      
8350: 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74    */ "authorizat
8360: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
8370: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41   /* SQLITE_FORMA
8380: 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c  T      */ "auxil
8390: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f  iary database fo
83a0: 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20  rmat error",.   
83b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45   /* SQLITE_RANGE
83c0: 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20         */ "bind 
83d0: 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  or column index 
83e0: 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20  out of range",. 
83f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
8400: 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c  ADB      */ "fil
8410: 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f  e is encrypted o
8420: 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  r is not a datab
8430: 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e  ase",.  };.  con
8440: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
8450: 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b  "unknown error";
8460: 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b  .  switch( rc ){
8470: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
8480: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a  _ABORT_ROLLBACK:
8490: 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20   {.      zErr = 
84a0: 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f  "abort due to RO
84b0: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62  LLBACK";.      b
84c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
84d0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
84e0: 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 20   rc &= 0xff;.   
84f0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63     if( ALWAYS(rc
8500: 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61 79  >=0) && rc<Array
8510: 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61 4d  Size(aMsg) && aM
8520: 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20  sg[rc]!=0 ){.   
8530: 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73 67       zErr = aMsg
8540: 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [rc];.      }.  
8550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8560: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45  .  }.  return zE
8570: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rr;.}../*.** Thi
8580: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
8590: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
85a0: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
85b0: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
85c0: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
85d0: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
85e0: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
85f0: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
8600: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
8610: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
8620: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
8630: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
8640: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
8650: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
8660: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76  BusyCallback(. v
8670: 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20  oid *ptr,       
8680: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
8690: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
86a0: 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20  /. int count    
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
86c0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
86d0: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75  able has been bu
86e0: 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c  sy */.){.#if SQL
86f0: 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64  ITE_OS_WIN || (d
8700: 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
8710: 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
8720: 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EP).  static con
8730: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
8740: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
8750: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
8760: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
8770: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
8780: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
8790: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
87a0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
87b0: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
87c0: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
87d0: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
87e0: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
87f0: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
8800: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
8810: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
8820: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
8830: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
8840: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
8850: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
8860: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
8870: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
8880: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
8890: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
88a0: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
88b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
88c0: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
88d0: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
88e0: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
88f0: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
8900: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
8910: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
8920: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
8930: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
8940: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
8950: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
8960: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
8970: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
8980: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
8990: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
89a0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
89b0: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
89c0: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
89d0: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
89e0: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
89f0: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
8a00: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
8a10: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
8a20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8a30: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
8a40: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
8a50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
8a60: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
8a70: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
8a80: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
8a90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8aa0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
8ab0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
8ac0: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
8ad0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
8ae0: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
8af0: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
8b00: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
8b10: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
8b20: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
8b30: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
8b40: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
8b50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
8b60: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
8b70: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
8b80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
8b90: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20   NEVER(p==0) || 
8ba0: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70  p->xFunc==0 || p
8bb0: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
8bc0: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  rn 0;.  rc = p->
8bd0: 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70  xFunc(p->pArg, p
8be0: 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20  ->nBusy);.  if( 
8bf0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  rc==0 ){.    p->
8c00: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
8c10: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
8c20: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
8c30: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
8c40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
8c50: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
8c60: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
8c70: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
8c80: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
8c90: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
8ca0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
8cb0: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
8cc0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
8cd0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
8ce0: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
8cf0: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
8d00: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
8d10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8d20: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8d30: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
8d40: 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a  .xFunc = xBusy;.
8d50: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
8d60: 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  r.pArg = pArg;. 
8d70: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
8d80: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
8d90: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
8da0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
8db0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8dc0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
8dd0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
8de0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8df0: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
8e00: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
8e10: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
8e20: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
8e30: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
8e40: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
8e50: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
8e60: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
8e70: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
8e80: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
8e90: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
8ea0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
8eb0: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
8ec0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
8ed0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
8ee0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
8ef0: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
8f00: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
8f10: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
8f20: 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74  *pArg.){.  sqlit
8f30: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
8f40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
8f50: 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64   nOps>0 ){.    d
8f60: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78  b->xProgress = x
8f70: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62  Progress;.    db
8f80: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
8f90: 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70   nOps;.    db->p
8fa0: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
8fb0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
8fc0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
8fd0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
8fe0: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
8ff0: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
9000: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
9010: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9020: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
9030: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
9040: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
9050: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
9060: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
9070: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
9080: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
9090: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
90a0: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
90b0: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
90c0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
90d0: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
90e0: 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d  int ms){.  if( m
90f0: 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  s>0 ){.    sqlit
9100: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
9110: 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c  db, sqliteDefaul
9120: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28  tBusyCallback, (
9130: 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64  void*)db);.    d
9140: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
9150: 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   ms;.  }else{.  
9160: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
9170: 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29  andler(db, 0, 0)
9180: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9190: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
91a0: 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e  ** Cause any pen
91b0: 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74  ding operation t
91c0: 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61  o stop at its ea
91d0: 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69  rliest opportuni
91e0: 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
91f0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71  te3_interrupt(sq
9200: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
9210: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
9220: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ed = 1;.}.../*.*
9230: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9240: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
9250: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63  ame as sqlite3_c
9260: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
9270: 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
9280: 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20   it is designed 
9290: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  to be called by 
92a0: 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54  internal code. T
92b0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
92c0: 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61  .** that if a ma
92d0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20  lloc() fails in 
92e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
92f0: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72  unction(), an er
9300: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72  ror code.** is r
9310: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
9320: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9330: 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69  g cleared. .*/.i
9340: 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  nt sqlite3Create
9350: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20  Func(.  sqlite3 
9360: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
9370: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
9380: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
9390: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
93a0: 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f  *pUserData,.  vo
93b0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
93c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
93d0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
93e0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
93f0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
9400: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
9410: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
9420: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
9430: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
9440: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
9450: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b   *pDestructor.){
9460: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
9470: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61   int nName;..  a
9480: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9490: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
94a0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
94b0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
94c0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
94d0: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
94e0: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
94f0: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
9500: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
9510: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
9520: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
9530: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
9540: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
9550: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
9560: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
9570: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
9580: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9590: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
95a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
95b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
95c0: 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64  PT;.  }.  .#ifnd
95d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
95e0: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
95f0: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
9600: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
9610: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
9620: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
9630: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
9640: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
9650: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
9660: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
9670: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
9680: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
9690: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
96a0: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
96b0: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
96c0: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
96d0: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
96e0: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
96f0: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
9700: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
9710: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
9720: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
9730: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
9740: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
9750: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
9760: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
9770: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
9780: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
9790: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
97a0: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
97b0: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70 55  TF8,.         pU
97c0: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
97d0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
97e0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
97f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9800: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
9810: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
9820: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
9830: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
9840: 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20 20  TE_UTF16LE,.    
9850: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
9860: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
9870: 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74  Final, pDestruct
9880: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  or);.    }.    i
9890: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
98a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
98b0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   rc;.    }.    e
98c0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
98d0: 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  6BE;.  }.#else. 
98e0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
98f0: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  F8;.#endif.  .  
9900: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65  /* Check if an e
9910: 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  xisting function
9920: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
9930: 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e  dden or deleted.
9940: 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64   If so,.  ** and
9950: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
9960: 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75  e VMs, then retu
9970: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
9980: 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20  If a function.  
9990: 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  ** is being over
99a0: 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62  ridden/deleted b
99b0: 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ut there are no 
99c0: 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f  active VMs, allo
99d0: 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  w the.  ** opera
99e0: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
99f0: 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20   but invalidate 
9a00: 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  all precompiled 
9a10: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
9a20: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
9a30: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
9a40: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e  FunctionName, nN
9a50: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
9a60: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
9a70: 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d  && p->iPrefEnc==
9a80: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
9a90: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
9aa0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
9ab0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
9ac0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
9ad0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
9ae0: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
9af0: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
9b00: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
9b10: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
9b20: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
9b30: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
9b40: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
9b50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
9b60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9b70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
9b80: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
9b90: 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ts(db);.    }.  
9ba0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
9bb0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
9bc0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
9bd0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
9be0: 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65  )enc, 1);.  asse
9bf0: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
9c00: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
9c10: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
9c20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9c30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
9c40: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66  older version of
9c50: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
9c60: 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20  th a configured 
9c70: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20  destructor is.  
9c80: 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ** being replace
9c90: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  d invoke the des
9ca0: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
9cb0: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63   here. */.  func
9cc0: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
9cd0: 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  p);..  if( pDest
9ce0: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
9cf0: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b  estructor->nRef+
9d00: 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73  +;.  }.  p->pDes
9d10: 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72  tructor = pDestr
9d20: 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61 67  uctor;.  p->flag
9d30: 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e  s = 0;.  p->xFun
9d40: 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e  c = xFunc;.  p->
9d50: 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20  xStep = xStep;. 
9d60: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
9d70: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
9d80: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
9d90: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
9da0: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
9db0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9dc0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
9dd0: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
9de0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9df0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
9e00: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
9e10: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9e20: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
9e30: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
9e40: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
9e50: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
9e60: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
9e70: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
9e80: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
9e90: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
9ea0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
9eb0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
9ec0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
9ed0: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
9ee0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
9ef0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
9f00: 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  v2(db, zFunc, nA
9f10: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
9f20: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
9f50: 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74  inal, 0);.}..int
9f60: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
9f70: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73  function_v2(.  s
9f80: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
9f90: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
9fa0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
9fb0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
9fc0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
9fd0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
9fe0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
9ff0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
a000: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
a010: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
a020: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
a030: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
a040: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
a050: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
a060: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
a070: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
a080: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
a090: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
a0a0: 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pArg = 0;.  sqli
a0b0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
a0c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
a0d0: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
a0e0: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
a0f0: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
a100: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
a110: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
a120: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
a130: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
a140: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
a150: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
a160: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
a170: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
a180: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
a190: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
a1a0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
a1b0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
a1c0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
a1d0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
a1e0: 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b  , xFinal, pArg);
a1f0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
a200: 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  Arg->nRef==0 ){.
a210: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
a220: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a230: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
a240: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a250: 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a  db, pArg);.  }..
a260: 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c   out:.  rc = sql
a270: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
a280: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
a290: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
a2a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
a2b0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
a2c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
a2d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
a2e0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a  ate_function16(.
a2f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
a300: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75   const void *zFu
a310: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
a320: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54  t nArg,.  int eT
a330: 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a  extRep,.  void *
a340: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
a350: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
a360: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
a370: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
a380: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
a390: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
a3a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
a3b0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
a3c0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
a3d0: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
a3e0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b  .  char *zFunc8;
a3f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a400: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
a410: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
a420: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a430: 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
a440: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
a450: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
a460: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
a470: 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
a480: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
a490: 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
a4a0: 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
a4b0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
a4c0: 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69  Final,0);.  sqli
a4d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46  te3DbFree(db, zF
a4e0: 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71  unc8);.  rc = sq
a4f0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
a500: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
a510: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
a520: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
a530: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a   rc;.}.#endif...
a540: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68  /*.** Declare th
a550: 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  at a function ha
a560: 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65  s been overloade
a570: 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74  d by a virtual t
a580: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
a590: 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65  he function alre
a5a0: 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20  ady exists as a 
a5b0: 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66  regular global f
a5c0: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a  unction, then.**
a5d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a5e0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68   a no-op.  If th
a5f0: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
a600: 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
a610: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
a620: 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20  one that always 
a630: 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d  throws a run-tim
a640: 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a  e error.  .**.**
a650: 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61   When virtual ta
a660: 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70  bles intend to p
a670: 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f  rovide an overlo
a680: 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74  aded function, t
a690: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61  hey.** should ca
a6a0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
a6b0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
a6c0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
a6d0: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c   exists..** A gl
a6e0: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75  obal function mu
a6f0: 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65  st exist in orde
a700: 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c  r for name resol
a710: 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a  ution to work.**
a720: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e   properly..*/.in
a730: 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  t sqlite3_overlo
a740: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ad_function(.  s
a750: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
a760: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
a770: 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20  .  int nArg.){. 
a780: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
a790: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
a7a0: 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  me);.  int rc = 
a7b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
a7c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a7d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
a7e0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f( sqlite3FindFu
a7f0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
a800: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , nName, nArg, S
a810: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d  QLITE_UTF8, 0)==
a820: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
a830: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
a840: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
a850: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
a880: 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69  te3InvalidFuncti
a890: 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  on, 0, 0, 0);.  
a8a0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
a8b0: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
a8c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a8d0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a8e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a8f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a900: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
a910: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  ** Register a tr
a920: 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ace function.  T
a930: 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
a940: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
a950: 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20  stered trace.** 
a960: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
a970: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63  *.** A NULL trac
a980: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
a990: 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67   that no tracing
a9a0: 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
a9b0: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61   non-NULL.** tra
a9c0: 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ce is a pointer 
a9d0: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
a9e0: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
a9f0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
aa00: 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  ch.** SQL statem
aa10: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ent..*/.void *sq
aa20: 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69  lite3_trace(sqli
aa30: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a  te3 *db, void (*
aa40: 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
aa50: 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
aa60: 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20   *pArg){.  void 
aa70: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
aa80: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
aa90: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
aaa0: 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b  = db->pTraceArg;
aab0: 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
aac0: 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
aad0: 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
aae0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aaf0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
ab00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
ab10: 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .}./*.** Registe
ab20: 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  r a profile func
ab30: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
ab40: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
ab50: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a  sly registered .
ab60: 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  ** profile funct
ab70: 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ion is returned.
ab80: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
ab90: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
aba0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70   means that no p
abb0: 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63  rofiling is exec
abc0: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
abd0: 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20  L.** profile is 
abe0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
abf0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
ac00: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
ac10: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20  onclusion of.** 
ac20: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
ac30: 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a  nt that is run..
ac40: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
ac50: 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69  _profile(.  sqli
ac60: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
ac70: 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64  (*xProfile)(void
ac80: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
ac90: 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20  lite_uint64),.  
aca0: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
acb0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
acc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
acd0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
ace0: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
acf0: 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
ad00: 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
ad10: 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
ad20: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
ad30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ad40: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
ad50: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
ad60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ad70: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
ad80: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
ad90: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
ada0: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
adb0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
adc0: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
add0: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
ade0: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
adf0: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
ae00: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
ae10: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
ae20: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
ae30: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
ae40: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
ae50: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
ae60: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
ae70: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
ae80: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
ae90: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
aea0: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
aeb0: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
aec0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
aed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
aee0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
aef0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
af00: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
af10: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
af20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
af30: 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  d = db->pCommitA
af40: 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69  rg;.  db->xCommi
af50: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  tCallback = xCal
af60: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f  lback;.  db->pCo
af70: 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a  mmitArg = pArg;.
af80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
af90: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
afa0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
afb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
afc0: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
afd0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
afe0: 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
aff0: 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
b000: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
b010: 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
b020: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
b030: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
b040: 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
b050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
b060: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
b070: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
b080: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
b090: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
b0a0: 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
b0b0: 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20  ar const *,char 
b0c0: 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69  const *,sqlite_i
b0d0: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
b0e0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
b0f0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
b100: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
b110: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
b120: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
b130: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
b140: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
b150: 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
b160: 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
b170: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
b180: 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
b190: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
b1a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
b1b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
b1c0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
b1d0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
b1e0: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
b1f0: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
b200: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
b210: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
b220: 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
b230: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
b240: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
b250: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
b260: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
b270: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
b280: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
b290: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
b2a0: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
b2b0: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
b2c0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
b2d0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
b300: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
b310: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
b320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b330: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
b340: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
b350: 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64  RollbackArg;.  d
b360: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
b370: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
b380: 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ;.  db->pRollbac
b390: 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  kArg = pArg;.  s
b3a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
b3b0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
b3c0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
b3d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b3e0: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
b3f0: 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  he sqlite3_wal_h
b400: 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72  ook() callback r
b410: 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c  egistered by sql
b420: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
b430: 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e  ckpoint()..** In
b440: 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c  voke sqlite3_wal
b450: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74  _checkpoint if t
b460: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
b470: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
b480: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
b490: 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70  r than sqlite3.p
b4a0: 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61  WalArg cast to a
b4b0: 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76  n integer (the v
b4c0: 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
b4d0: 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68  by.** wal_autoch
b4e0: 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20  eckpoint())..*/ 
b4f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44  .int sqlite3WalD
b500: 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f  efaultHook(.  vo
b510: 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c  id *pClientData,
b520: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
b530: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
b540: 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b,           /* 
b550: 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  Connection */.  
b560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
b570: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
b580: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61  se */.  int nFra
b590: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  me             /
b5a0: 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f  * Size of WAL */
b5b0: 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  .){.  if( nFrame
b5c0: 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  >=SQLITE_PTR_TO_
b5d0: 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29  INT(pClientData)
b5e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
b5f0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
b600: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
b610: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64  wal_checkpoint(d
b620: 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c  b, zDb);.    sql
b630: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
b640: 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  loc();.  }.  ret
b650: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b660: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b670: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
b680: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61  *.** Configure a
b690: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  n sqlite3_wal_ho
b6a0: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ok() callback to
b6b0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
b6c0: 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64  heckpoint.** a d
b6d0: 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f  atabase after co
b6e0: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
b6f0: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
b700: 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a  are nFrame or.**
b710: 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20   more frames in 
b720: 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61  the log file. Pa
b730: 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20  ssing zero or a 
b740: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61  negative value a
b750: 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20  s the.** nFrame 
b760: 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c  parameter disabl
b770: 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  es automatic che
b780: 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c  ckpoints entirel
b790: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
b7a0: 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
b7b0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
b7c0: 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65  n replaces any e
b7d0: 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b  xisting callback
b7e0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75  .** registered u
b7f0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
b800: 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73  _hook(). Likewis
b810: 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61  e, registering a
b820: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69   callback.** usi
b830: 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
b840: 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74  ook() disables t
b850: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  he automatic che
b860: 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73  ckpoint mechanis
b870: 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  m.** configured 
b880: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b890: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b8a0: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
b8b0: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
b8c0: 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69   int nFrame){.#i
b8d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
b8e0: 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41  _WAL.  UNUSED_PA
b8f0: 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
b900: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
b910: 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20  nFrame);.#else. 
b920: 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b   if( nFrame>0 ){
b930: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
b940: 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65  _hook(db, sqlite
b950: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c  3WalDefaultHook,
b960: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
b970: 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d  TR(nFrame));.  }
b980: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b990: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30  3_wal_hook(db, 0
b9a0: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
b9b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b9c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
b9d0: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
b9e0: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
b9f0: 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
ba00: 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74  saction is writt
ba10: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77  en.** into the w
ba20: 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62  rite-ahead-log b
ba30: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
ba40: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
ba50: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c  oid *sqlite3_wal
ba60: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
ba70: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
ba80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
ba90: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
baa0: 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  his db handle */
bab0: 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63  .  int(*xCallbac
bac0: 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74  k)(void *, sqlit
bad0: 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  e3*, const char*
bae0: 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  , int),.  void *
baf0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
bb10: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
bb20: 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28  ed to xCallback(
bb30: 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  ) */.){.#ifndef 
bb40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
bb50: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
bb60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
bb70: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
bb80: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61    pRet = db->pWa
bb90: 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c  lArg;.  db->xWal
bba0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
bbb0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c  back;.  db->pWal
bbc0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
bbd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
bbe0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
bbf0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c  return pRet;.#el
bc00: 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
bc10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
bc20: 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
bc30: 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73  se zDb..*/.int s
bc40: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
bc50: 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69  point_v2(.  sqli
bc60: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bc80: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
bc90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
bca0: 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
bcb0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
bcc0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
bcd0: 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
bce0: 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20  int eMode,      
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  /* SQLITE_CHECKP
bd10: 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a  OINT_* value */.
bd20: 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20    int *pnLog,   
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
bd50: 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61  f WAL log in fra
bd60: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
bd70: 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20  Ckpt            
bd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
bd90: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
bda0: 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69   frames checkpoi
bdb0: 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  nted */.){.#ifde
bdc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
bdd0: 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  L.  return SQLIT
bde0: 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  E_OK;.#else.  in
bdf0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be10: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
be20: 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49    int iDb = SQLI
be30: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b  TE_MAX_ATTACHED;
be40: 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62    /* sqlite3.aDb
be50: 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74  [] index of db t
be60: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  o checkpoint */.
be70: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
be80: 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
be90: 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63  ables to -1 in c
bea0: 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
beb0: 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e  urs. */.  if( pn
bec0: 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d  Log ) *pnLog = -
bed0: 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20  1;.  if( pnCkpt 
bee0: 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a  ) *pnCkpt = -1;.
bef0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
bf00: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
bf10: 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  L>SQLITE_CHECKPO
bf20: 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b 0a 20  INT_PASSIVE );. 
bf30: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
bf40: 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c  CHECKPOINT_FULL<
bf50: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
bf60: 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 61  T_RESTART );.  a
bf70: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
bf80: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
bf90: 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b  +2==SQLITE_CHECK
bfa0: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b  POINT_RESTART );
bfb0: 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c  .  if( eMode<SQL
bfc0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
bfd0: 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e  ASSIVE || eMode>
bfe0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
bff0: 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20 20 20  T_RESTART ){.   
c000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
c010: 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  ISUSE;.  }..  sq
c020: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c030: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c040: 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
c050: 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
c060: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
c070: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
c080: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
c090: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
c0a0: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
c0b0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
c0c0: 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e  _ERROR, "unknown
c0d0: 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20   database: %s", 
c0e0: 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  zDb);.  }else{. 
c0f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
c100: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44  heckpoint(db, iD
c110: 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  b, eMode, pnLog,
c120: 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71   pnCkpt);.    sq
c130: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
c140: 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  c, 0);.  }.  rc 
c150: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
c160: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
c170: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
c180: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
c190: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
c1a0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  }.../*.** Checkp
c1b0: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
c1c0: 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c  b. If zDb is NUL
c1d0: 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66  L, or if the buf
c1e0: 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a  fer zDb points.*
c1f0: 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20  * to contains a 
c200: 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69  zero-length stri
c210: 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64  ng, all attached
c220: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a   databases are .
c230: 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
c240: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
c250: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73  wal_checkpoint(s
c260: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
c270: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
c280: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77  return sqlite3_w
c290: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
c2a0: 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
c2b0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
c2c0: 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23  IVE, 0, 0);.}..#
c2d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c2e0: 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e  IT_WAL./*.** Run
c2f0: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e   a checkpoint on
c300: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54   database iDb. T
c310: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
c320: 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69  f database iDb i
c330: 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74  s.** not current
c340: 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d  ly open in WAL m
c350: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
c360: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
c370: 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
c380: 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ase being checkp
c390: 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a  ointed, this .**
c3a0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
c3b0: 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  s SQLITE_LOCKED 
c3c0: 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  and a checkpoint
c3d0: 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
c3e0: 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  d. If .** an err
c3f0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
c400: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63  running the chec
c410: 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74  kpoint, an SQLit
c420: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
c430: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e  .** returned (i.
c440: 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  e. SQLITE_IOERR)
c450: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
c460: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
c470: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
c480: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68  ase handle db sh
c490: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20  ould be held by 
c4a0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20  the caller. The 
c4b0: 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61  mutex.** associa
c4c0: 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65  ted with the spe
c4d0: 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69  cific b-tree bei
c4e0: 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  ng checkpointed 
c4f0: 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74  is taken by.** t
c500: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  his function whi
c510: 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  le the checkpoin
c520: 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a  t is running..**
c530: 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61  .** If iDb is pa
c540: 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ssed SQLITE_MAX_
c550: 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61  ATTACHED, then a
c560: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
c570: 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65  bases are.** che
c580: 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e  ckpointed. If an
c590: 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
c5a0: 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75  tered it is retu
c5b0: 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rned immediately
c5c0: 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74   -.** no attempt
c5d0: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63   is made to chec
c5e0: 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69  kpoint any remai
c5f0: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a  ning databases..
c600: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
c610: 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20  eMode is one of 
c620: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
c630: 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20  T_PASSIVE, FULL 
c640: 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69  or RESTART..*/.i
c650: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70  nt sqlite3Checkp
c660: 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
c670: 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65  , int iDb, int e
c680: 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67  Mode, int *pnLog
c690: 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a  , int *pnCkpt){.
c6a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c6b0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
c6c0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
c6d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
c700: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
c710: 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f   attached dbs */
c720: 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30  .  int bBusy = 0
c730: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c740: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51     /* True if SQ
c750: 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65  LITE_BUSY has be
c760: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  en encountered *
c770: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
c780: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c790: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
c7a0: 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c  assert( !pnLog |
c7b0: 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a  | *pnLog==-1 );.
c7c0: 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70    assert( !pnCkp
c7d0: 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31  t || *pnCkpt==-1
c7e0: 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   );..  for(i=0; 
c7f0: 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d  i<db->nDb && rc=
c800: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
c810: 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62  {.    if( i==iDb
c820: 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f   || iDb==SQLITE_
c830: 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a  MAX_ATTACHED ){.
c840: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c850: 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e  e3BtreeCheckpoin
c860: 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  t(db->aDb[i].pBt
c870: 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
c880: 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70  pnCkpt);.      p
c890: 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nLog = 0;.      
c8a0: 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20  pnCkpt = 0;.    
c8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c8c0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
c8d0: 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20   bBusy = 1;.    
c8e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c8f0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
c900: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c910: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
c920: 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54  & bBusy) ? SQLIT
c930: 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23  E_BUSY : rc;.}.#
c940: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c950: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
c960: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c970: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
c980: 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f   main-memory sho
c990: 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74  uld be used inst
c9a0: 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ead of.** a temp
c9b0: 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74  orary file for t
c9c0: 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66  ransient pager f
c9d0: 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65  iles and stateme
c9e0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  nt journals..** 
c9f0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
ca00: 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
ca10: 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74  e value of db->t
ca20: 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69  emp_store (runti
ca30: 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29  me.** parameter)
ca40: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
ca50: 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53   time value of S
ca60: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
ca70: 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  . The.** followi
ca80: 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
ca90: 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  es the relations
caa0: 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73  hip between thes
cab0: 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
cac0: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
cad0: 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ns return value.
cae0: 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
caf0: 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64  TEMP_STORE     d
cb00: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20  b->temp_store   
cb10: 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65    Location of te
cb20: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
cb30: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
cb40: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
cb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
cb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
cb80: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
cb90: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
cbb0: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
cbc0: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
cbf0: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
cc00: 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
cc40: 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20  urn 1).**   1   
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
cc70: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
cc80: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
ccb0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
ccc0: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
ccd0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
cce0: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
ccf0: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
cd00: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
cd10: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
cd20: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
cd40: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
cd50: 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20  1).**   3       
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
cd70: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
cd80: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
cd90: 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1).*/.int sql
cda0: 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
cdb0: 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a  (const sqlite3 *
cdc0: 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  db){.#if SQLITE_
cdd0: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20  TEMP_STORE==1.  
cde0: 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
cdf0: 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65  p_store==2 );.#e
ce00: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
ce10: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20  TEMP_STORE==2.  
ce20: 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
ce30: 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65  p_store!=1 );.#e
ce40: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
ce50: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20  TEMP_STORE==3.  
ce60: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
ce70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
ce80: 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49  _STORE<1 || SQLI
ce90: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a  TE_TEMP_STORE>3.
cea0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
ceb0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
cec0: 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  rn UTF-8 encoded
ced0: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
cee0: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
cef0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
cf00: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
cf10: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
cf20: 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33  3_errmsg(sqlite3
cf30: 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63   *db){.  const c
cf40: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  har *z;.  if( !d
cf50: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
cf60: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
cf70: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d  LITE_NOMEM);.  }
cf80: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
cf90: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
cfa0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
cfb0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
cfc0: 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  tr(SQLITE_MISUSE
cfd0: 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71  _BKPT);.  }.  sq
cfe0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
cff0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d000: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d010: 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
d020: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
d030: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d  LITE_NOMEM);.  }
d040: 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 28 63  else{.    z = (c
d050: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
d060: 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72  ue_text(db->pErr
d070: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
d080: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d090: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30   );.    if( z==0
d0a0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
d0b0: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
d0c0: 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  errCode);.    }.
d0d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
d0e0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d0f0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
d100: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
d110: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
d120: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
d130: 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  16 encoded Engli
d140: 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
d150: 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
d160: 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
d170: 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  ror..*/.const vo
d180: 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  id *sqlite3_errm
d190: 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62  sg16(sqlite3 *db
d1a0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
d1b0: 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d  t u16 outOfMem[]
d1c0: 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75   = {.    'o', 'u
d1d0: 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27  ', 't', ' ', 'o'
d1e0: 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c  , 'f', ' ', 'm',
d1f0: 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20   'e', 'm', 'o', 
d200: 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b  'r', 'y', 0.  };
d210: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d220: 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b  u16 misuse[] = {
d230: 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27  .    'l', 'i', '
d240: 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72  b', 'r', 'a', 'r
d250: 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'y', ' ', .  
d260: 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c    'r', 'o', 'u',
d270: 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20   't', 'i', 'n', 
d280: 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'e', ' ', .    '
d290: 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c  c', 'a', 'l', 'l
d2a0: 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27  ', 'e', 'd', ' '
d2b0: 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c  , .    'o', 'u',
d2c0: 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   't', ' ', .    
d2d0: 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a  'o', 'f', ' ', .
d2e0: 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71      's', 'e', 'q
d2f0: 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27  ', 'u', 'e', 'n'
d300: 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20  , 'c', 'e', 0.  
d310: 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  };..  const void
d320: 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
d330: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
d340: 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
d350: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
d360: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
d370: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
d380: 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d  return (void *)m
d390: 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  isuse;.  }.  sql
d3a0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d3b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
d3c0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
d3d0: 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28  led ){.    z = (
d3e0: 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
d3f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
d400: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
d410: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
d420: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
d430: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
d440: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
d450: 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  Err, -1, sqlite3
d460: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
d470: 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  de),.           
d480: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
d490: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
d4a0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
d4b0: 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
d4c0: 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
d4d0: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
d4e0: 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
d4f0: 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
d500: 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
d510: 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
d520: 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
d530: 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
d540: 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
d550: 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
d560: 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
d570: 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
d580: 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
d590: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
d5a0: 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
d5b0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
d5c0: 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
d5d0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
d5e0: 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
d5f0: 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
d600: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d610: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 0;.  }.  sql
d620: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d630: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
d640: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
d650: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d660: 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
d670: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   Return the most
d680: 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
d690: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
d6a0: 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e  an SQLite routin
d6b0: 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a  e. If NULL is.**
d6c0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
d6d0: 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73  function, we ass
d6e0: 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ume a malloc() f
d6f0: 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c  ailed during sql
d700: 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a  ite3_open()..*/.
d710: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63  int sqlite3_errc
d720: 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
d730: 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
d740: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
d750: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
d760: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d770: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d780: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
d790: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d7a0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
d7b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d7c0: 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
d7d0: 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72  rrCode & db->err
d7e0: 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Mask;.}.int sqli
d7f0: 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
d800: 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
d810: 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
d820: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
d830: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
d840: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d850: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d860: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
d870: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
d880: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
d890: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d8a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
d8b0: 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errCode;.}../*.*
d8c0: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
d8d0: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
d8e0: 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
d8f0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
d900: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
d910: 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20    For now, this 
d920: 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65  simply calls the
d930: 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65   internal sqlite
d940: 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e  3ErrStr().** fun
d950: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
d960: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
d970: 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rstr(int rc){.  
d980: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
d990: 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rStr(rc);.}../*.
d9a0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
d9b0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
d9c0: 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
d9d0: 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
d9e0: 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
d9f0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
da00: 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
da10: 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
da20: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
da30: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
da40: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e  *zName, .  u8 en
da50: 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  c,.  void* pCtx,
da60: 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
da70: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
da80: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
da90: 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
daa0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
dab0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
dac0: 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a  ll;.  int enc2;.
dad0: 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71    int nName = sq
dae0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
daf0: 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  ame);.  .  asser
db00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
db10: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
db20: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c   );..  /* If SQL
db30: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
db40: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
db50: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
db60: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
db70: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
db80: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
db90: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
dba0: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
dbb0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
dbc0: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
dbd0: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
dbe0: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
dbf0: 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74   enc2 = enc;.  t
dc00: 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
dc10: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20  QLITE_UTF16 );. 
dc20: 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
dc30: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
dc40: 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65  IGNED );.  if( e
dc50: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
dc60: 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54  6 || enc2==SQLIT
dc70: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
dc80: 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51  ){.    enc2 = SQ
dc90: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
dca0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32  ;.  }.  if( enc2
dcb0: 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  <SQLITE_UTF8 || 
dcc0: 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31  enc2>SQLITE_UTF1
dcd0: 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  6BE ){.    retur
dce0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
dcf0: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
dd00: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61  Check if this ca
dd10: 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f  ll is removing o
dd20: 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65  r replacing an e
dd30: 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  xisting collatio
dd40: 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65  n .  ** sequence
dd50: 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65  . If so, and the
dd60: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
dd70: 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20  s, return busy. 
dd80: 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72  If there.  ** ar
dd90: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
dda0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
ddb0: 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
ddc0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
ddd0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
dde0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
ddf0: 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
de00: 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20  0);.  if( pColl 
de10: 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  && pColl->xCmp )
de20: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63  {.    if( db->ac
de30: 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20  tiveVdbeCnt ){. 
de40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
de50: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
de60: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
de70: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
de80: 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  dify collation s
de90: 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61  equence due to a
dea0: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
deb0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
dec0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
ded0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
dee0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
def0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20  tements(db);..  
df00: 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f    /* If collatio
df10: 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
df20: 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72   was created dir
df30: 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20  ectly by a call 
df40: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
df50: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
df60: 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65  on, and not gene
df70: 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f  rated by synthCo
df80: 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20  llSeq(),.    ** 
df90: 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20  then any copies 
dfa0: 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c  made by synthCol
dfb0: 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62  lSeq() need to b
dfc0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20  e invalidated.. 
dfd0: 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c     ** Also, coll
dfe0: 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72  ation destructor
dff0: 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28   - CollSeq.xDel(
e000: 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  ) - function may
e010: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
e020: 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  be called..    *
e030: 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c  / .    if( (pCol
e040: 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  l->enc & ~SQLITE
e050: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d  _UTF16_ALIGNED)=
e060: 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43  =enc2 ){.      C
e070: 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20  ollSeq *aColl = 
e080: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
e090: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a  &db->aCollSeq, z
e0a0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
e0b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
e0c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
e0d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
e0e0: 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c  lSeq *p = &aColl
e0f0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
e100: 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e   p->enc==pColl->
e110: 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  enc ){.         
e120: 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a   if( p->xDel ){.
e130: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78              p->x
e140: 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20  Del(p->pUser);. 
e150: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e160: 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30       p->xCmp = 0
e170: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e180: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e190: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
e1a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
e1b0: 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
e1c0: 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   1);.  if( pColl
e1d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
e1e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f  ITE_NOMEM;.  pCo
e1f0: 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70  ll->xCmp = xComp
e200: 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55  are;.  pColl->pU
e210: 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43  ser = pCtx;.  pC
e220: 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c  oll->xDel = xDel
e230: 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d  ;.  pColl->enc =
e240: 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e   (u8)(enc2 | (en
e250: 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c & SQLITE_UTF16
e260: 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71  _ALIGNED));.  sq
e270: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
e280: 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
e290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e2a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
e2b0: 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 68   array defines h
e2c0: 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73  ard upper bounds
e2d0: 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73   on limit values
e2e0: 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61  .  The.** initia
e2f0: 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65  lizer must be ke
e300: 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20  pt in sync with 
e310: 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  the SQLITE_LIMIT
e320: 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69  _*.** #defines i
e330: 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a  n sqlite3.h..*/.
e340: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
e350: 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20   aHardLimit[] = 
e360: 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  {.  SQLITE_MAX_L
e370: 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
e380: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a  MAX_SQL_LENGTH,.
e390: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c    SQLITE_MAX_COL
e3a0: 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  UMN,.  SQLITE_MA
e3b0: 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20  X_EXPR_DEPTH,.  
e3c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
e3d0: 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51  UND_SELECT,.  SQ
e3e0: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
e3f0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  ,.  SQLITE_MAX_F
e400: 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53  UNCTION_ARG,.  S
e410: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
e420: 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  ED,.  SQLITE_MAX
e430: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
e440: 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
e450: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
e460: 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  ER,.  SQLITE_MAX
e470: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a  _TRIGGER_DEPTH,.
e480: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
e490: 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
e4a0: 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
e4b0: 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
e4c0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
e4d0: 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
e4e0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
e4f0: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
e500: 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
e510: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
e520: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
e530: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
e540: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
e550: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
e560: 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
e570: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
e580: 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
e590: 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
e5a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
e5b0: 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
e5c0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
e5d0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
e5e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
e5f0: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
e600: 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
e610: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
e620: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
e630: 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
e640: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e650: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
e660: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
e670: 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
e680: 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
e690: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e6a0: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
e6b0: 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
e6c0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
e6d0: 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  000.# error SQLI
e6e0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
e6f0: 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77  ARG must be betw
e700: 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23  een 0 and 1000.#
e710: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e720: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20  _MAX_ATTACHED<0 
e730: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  || SQLITE_MAX_AT
e740: 54 41 43 48 45 44 3e 36 32 0a 23 20 65 72 72 6f  TACHED>62.# erro
e750: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  r SQLITE_MAX_ATT
e760: 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65  ACHED must be be
e770: 74 77 65 65 6e 20 30 20 61 6e 64 20 36 32 0a 23  tween 0 and 62.#
e780: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
e790: 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
e7a0: 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72  N_LENGTH<1.# err
e7b0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  or SQLITE_MAX_LI
e7c0: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
e7d0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
e7e0: 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
e7f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
e800: 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20  N>32767.# error 
e810: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
e820: 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65  N must not excee
e830: 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23  d 32767.#endif.#
e840: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  if SQLITE_MAX_TR
e850: 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20  IGGER_DEPTH<1.# 
e860: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
e870: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d  _TRIGGER_DEPTH m
e880: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
e890: 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  1.#endif.../*.**
e8a0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
e8b0: 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
e8c0: 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
e8d0: 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
e8e0: 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
e8f0: 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
e900: 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
e910: 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
e920: 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
e930: 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
e940: 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
e950: 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
e960: 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
e970: 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
e980: 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
e990: 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
e9a0: 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
e9b0: 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
e9c0: 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
e9d0: 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
e9e0: 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
e9f0: 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
ea00: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
ea10: 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
ea20: 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
ea30: 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45  it;...  /* EVIDE
ea40: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d  NCE-OF: R-30189-
ea50: 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c  54097 For each l
ea60: 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51  imit category SQ
ea70: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a  LITE_LIMIT_NAME.
ea80: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
ea90: 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
eaa0: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
eab0: 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70  time by a C prep
eac0: 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61  rocessor.  ** ma
ead0: 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54  cro called SQLIT
eae0: 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65  E_MAX_NAME. (The
eaf0: 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68   "_LIMIT_" in th
eb00: 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65  e name is change
eb10: 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f  d to.  ** "_MAX_
eb20: 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ".).  */.  asser
eb30: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
eb40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
eb50: 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  H]==SQLITE_MAX_L
eb60: 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
eb70: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
eb80: 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
eb90: 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
eba0: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b  AX_SQL_LENGTH );
ebb0: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
ebc0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
ebd0: 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49  IT_COLUMN]==SQLI
ebe0: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b  TE_MAX_COLUMN );
ebf0: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
ec00: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
ec10: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d  IT_EXPR_DEPTH]==
ec20: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
ec30: 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
ec40: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
ec50: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
ec60: 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c  UND_SELECT]==SQL
ec70: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
ec80: 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65  _SELECT);.  asse
ec90: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
eca0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
ecb0: 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  _OP]==SQLITE_MAX
ecc0: 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73  _VDBE_OP );.  as
ecd0: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
ece0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  [SQLITE_LIMIT_FU
ecf0: 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c  NCTION_ARG]==SQL
ed00: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
ed10: 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74  _ARG );.  assert
ed20: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
ed30: 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
ed40: 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ED]==SQLITE_MAX_
ed50: 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73  ATTACHED );.  as
ed60: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
ed70: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
ed80: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
ed90: 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  H]==.           
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c      SQLITE_MAX_L
edd0: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
ede0: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
edf0: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
ee00: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
ee10: 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45  _NUMBER]==SQLITE
ee20: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
ee30: 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28  MBER);.  assert(
ee40: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
ee50: 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
ee60: 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
ee70: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
ee80: 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  H );.  assert( S
ee90: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
eea0: 47 45 52 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49  GER_DEPTH==(SQLI
eeb0: 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b  TE_N_LIMIT-1) );
eec0: 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64  ...  if( limitId
eed0: 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53  <0 || limitId>=S
eee0: 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b  QLITE_N_LIMIT ){
eef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
ef00: 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d    }.  oldLimit =
ef10: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
ef20: 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c  tId];.  if( newL
ef30: 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20  imit>=0 ){      
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ef50: 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37  IMP: R-52476-287
ef60: 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  32 */.    if( ne
ef70: 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69  wLimit>aHardLimi
ef80: 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20  t[limitId] ){.  
ef90: 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61      newLimit = a
efa0: 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  HardLimit[limitI
efb0: 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  d];  /* IMP: R-5
efc0: 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20  1463-25634 */.  
efd0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d    }.    db->aLim
efe0: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65  it[limitId] = ne
eff0: 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  wLimit;.  }.  re
f000: 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20  turn oldLimit;  
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33     /* IMP: R-533
f030: 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f  41-35419 */.}../
f040: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
f050: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61  on is used to pa
f060: 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e  rse both URIs an
f070: 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  d non-URI filena
f080: 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68  mes passed by th
f090: 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49  e.** user to API
f0a0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74   functions sqlit
f0b0: 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c  e3_open() or sql
f0c0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20  ite3_open_v2(), 
f0d0: 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65  and for database
f0e0: 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69  .** URIs specifi
f0f0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54  ed as part of AT
f100: 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e  TACH statements.
f110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
f120: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
f130: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
f140: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  e name of the VF
f150: 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20  S to use (or.** 
f160: 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66  a NULL to signif
f170: 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  y the default VF
f180: 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f  S) if the URI do
f190: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
f1a0: 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75   "vfs=xxx".** qu
f1b0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54  ery parameter. T
f1c0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
f1d0: 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  nt contains the 
f1e0: 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20  URI (or non-URI 
f1f0: 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73  filename).** its
f200: 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66  elf. When this f
f210: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
f220: 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61  d the *pFlags va
f230: 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f  riable should co
f240: 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66  ntain.** the def
f250: 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70  ault flags to op
f260: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
f270: 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65  handle with. The
f280: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
f290: 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20  .** *pFlags may 
f2a0: 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72  be updated befor
f2b0: 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74  e returning if t
f2c0: 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20  he URI filename 
f2d0: 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61  contains .** "ca
f2e0: 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64  che=xxx" or "mod
f2f0: 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72  e=xxx" query par
f300: 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  ameters..**.** I
f310: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
f320: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
f330: 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
f340: 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20  e *ppVfs is set 
f350: 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
f360: 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75  he VFS that shou
f370: 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70  ld be used to op
f380: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
f390: 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73  file. *pzFile is
f3a0: 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74   set to.** point
f3b0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
f3c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
f3d0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
f3e0: 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20  open. It is the 
f3f0: 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
f400: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
f410: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63   to eventually c
f420: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  all sqlite3_free
f430: 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a  () to release.**
f440: 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a   this buffer..**
f450: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
f460: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20  occurs, then an 
f470: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
f480: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
f490: 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d  d *pzErrMsg.** m
f4a0: 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
f4b0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
f4c0: 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67  ontaining an Eng
f4d0: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
f4e0: 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e  ror .** message.
f4f0: 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
f500: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
f510: 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
f520: 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a  ually release.**
f530: 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20   this buffer by 
f540: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
f550: 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  free()..*/.int s
f560: 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a  qlite3ParseUri(.
f570: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
f580: 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20  efaultVfs,      
f590: 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20    /* VFS to use 
f5a0: 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20  if no "vfs=xxx" 
f5b0: 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a  query option */.
f5c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
f5d0: 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ri,             
f5e0: 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
f5f0: 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65  ted URI to parse
f600: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
f610: 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20  nt *pFlags,     
f620: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
f630: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
f640: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69   flags */.  sqli
f650: 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c  te3_vfs **ppVfs,
f660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f670: 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a  UT: VFS to use *
f680: 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69  / .  char **pzFi
f690: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
f6a0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c       /* OUT: Fil
f6b0: 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  ename component 
f6c0: 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72  of URI */.  char
f6d0: 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20   **pzErrMsg     
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f6f0: 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  UT: Error messag
f700: 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45  e (if rc!=SQLITE
f710: 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  _OK) */.){.  int
f720: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f730: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
f740: 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b  flags = *pFlags;
f750: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f760: 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66  Vfs = zDefaultVf
f770: 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  s;.  char *zFile
f780: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e  ;.  char c;.  in
f790: 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33  t nUri = sqlite3
f7a0: 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a  Strlen30(zUri);.
f7b0: 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72  .  assert( *pzEr
f7c0: 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  rMsg==0 );..  if
f7d0: 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  ( ((flags & SQLI
f7e0: 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20  TE_OPEN_URI) || 
f7f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
f800: 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20  fig.bOpenUri) . 
f810: 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20    && nUri>=5 && 
f820: 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69  memcmp(zUri, "fi
f830: 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20 29  le:", 5)==0 .  )
f840: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  {.    char *zOpt
f850: 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  ;.    int eState
f860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f870: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74      /* Parser st
f880: 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ate when parsing
f890: 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20   URI */.    int 
f8a0: 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  iIn;            
f8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
f8c0: 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
f8d0: 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  ex */.    int iO
f8e0: 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
f8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
f900: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
f910: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  x */.    int nBy
f920: 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20  te = nUri+2;    
f930: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
f940: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
f950: 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  cate */..    /* 
f960: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51  Make sure the SQ
f970: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c  LITE_OPEN_URI fl
f980: 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64  ag is set to ind
f990: 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53  icate to the VFS
f9a0: 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d   xOpen .    ** m
f9b0: 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65  ethod that there
f9c0: 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61   may be extra pa
f9d0: 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69  rameters followi
f9e0: 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65  ng the file-name
f9f0: 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  .  */.    flags 
fa00: 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
fa10: 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e  RI;..    for(iIn
fa20: 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49  =0; iIn<nUri; iI
fa30: 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a  n++) nByte += (z
fa40: 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a  Uri[iIn]=='&');.
fa50: 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
fa60: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
fa70: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
fa80: 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
fa90: 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a  E_NOMEM;..    /*
faa0: 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68   Discard the sch
fab0: 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74  eme and authorit
fac0: 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68  y segments of th
fad0: 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66  e URI. */.    if
fae0: 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26  ( zUri[5]=='/' &
faf0: 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29  & zUri[6]=='/' )
fb00: 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
fb10: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55  .      while( zU
fb20: 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
fb30: 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b  iIn]!='/' ) iIn+
fb40: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 49  +;..      if( iI
fb50: 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36  n!=7 && (iIn!=16
fb60: 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61   || memcmp("loca
fb70: 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d  lhost", &zUri[7]
fb80: 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 9)) ){.       
fb90: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
fba0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e  ite3_mprintf("in
fbb0: 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72  valid uri author
fbc0: 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20  ity: %.*s", .   
fbd0: 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20           iIn-7, 
fbe0: 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20  &zUri[7]);.     
fbf0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
fc00: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
fc10: 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
fc20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
fc30: 6c 73 65 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  lse{.      iIn =
fc40: 20 35 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   5;.    }..    /
fc50: 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
fc60: 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
fc70: 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
fc80: 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
fc90: 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
fca0: 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
fcb0: 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
fcc0: 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
fcd0: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
fce0: 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
fcf0: 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
fd00: 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
fd10: 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
fd20: 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
fd30: 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
fd40: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
fd50: 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
fd60: 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
fd70: 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
fd80: 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
fd90: 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
fda0: 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
fdb0: 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
fdc0: 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
fdd0: 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
fde0: 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
fdf0: 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
fe00: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
fe10: 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
fe20: 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
fe30: 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
fe40: 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
fe50: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
fe60: 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
fe70: 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
fe80: 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
fe90: 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
fea0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
feb0: 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
fec0: 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
fed0: 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
fee0: 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
fef0: 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
ff00: 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
ff10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
ff20: 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
ff30: 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
ff40: 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20  f( octet==0 ){. 
ff50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
ff60: 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
ff70: 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65   when "%00" appe
ff80: 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55  ars within the U
ff90: 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  RI. In this.    
ffa0: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65        ** case we
ffb0: 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74   ignore all text
ffc0: 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
ffd0: 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e  r of the path, n
ffe0: 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20  ame or.         
fff0: 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e   ** value curren
10000 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64  tly being parsed
10010 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  . So ignore the 
10020 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65  current characte
10030 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  r.          ** a
10040 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e  nd skip to the n
10050 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20  ext "?", "=" or 
10060 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  "&", as appropri
10070 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ate. */.        
10080 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
10090 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
100a0 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20  !='#' .         
100b0 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
100c0 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20  =0 || c!='?').  
100d0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
100e0 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21  eState!=1 || (c!
100f0 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29  ='=' && c!='&'))
10100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
10110 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20  & (eState!=2 || 
10120 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20  c!='&').        
10130 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
10140 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
10150 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f    }.          co
10160 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
10170 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63  }.        c = oc
10180 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tet;.      }else
10190 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26   if( eState==1 &
101a0 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d  & (c=='&' || c==
101b0 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
101c0 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31  if( zFile[iOut-1
101d0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
101e0 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70    /* An empty op
101f0 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72  tion name. Ignor
10200 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c  e this option al
10210 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20  together. */.   
10220 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55         while( zU
10230 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
10240 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72  iIn]!='#' && zUr
10250 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20  i[iIn-1]!='&' ) 
10260 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
10270 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
10280 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10290 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20   c=='&' ){.     
102a0 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
102b0 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  +] = '\0';.     
102c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102d0 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a      eState = 2;.
102e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
102f0 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    c = 0;.      }
10300 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65  else if( (eState
10310 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c  ==0 && c=='?') |
10320 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20  | (eState==2 && 
10330 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20  c=='&') ){.     
10340 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
10350 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20    eState = 1;.  
10360 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c      }.      zFil
10370 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20  e[iOut++] = c;. 
10380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74     }.    if( eSt
10390 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69  ate==1 ) zFile[i
103a0 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
103b0 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
103c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
103d0 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
103e0 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ';..    /* Check
103f0 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61   if there were a
10400 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69  ny options speci
10410 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64  fied that should
10420 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
10430 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70  .    ** here. Op
10440 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69  tions that are i
10450 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20  nterpreted here 
10460 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e  include "vfs" an
10470 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20  d those that.   
10480 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74   ** correspond t
10490 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79  o flags that may
104a0 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
104b0 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  e sqlite3_open_v
104c0 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  2().    ** metho
104d0 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d  d. */.    zOpt =
104e0 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53   &zFile[sqlite3S
104f0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
10500 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f  ];.    while( zO
10510 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69  pt[0] ){.      i
10520 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65  nt nOpt = sqlite
10530 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b  3Strlen30(zOpt);
10540 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61  .      char *zVa
10550 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31  l = &zOpt[nOpt+1
10560 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61  ];.      int nVa
10570 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
10580 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20  n30(zVal);..    
10590 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26    if( nOpt==3 &&
105a0 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a   memcmp("vfs", z
105b0 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 3)==0 ){.  
105c0 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61        zVfs = zVa
105d0 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  l;.      }else{.
105e0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f          struct O
105f0 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20  penMode {.      
10600 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10610 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  z;.          int
10620 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
10630 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20   *aMode = 0;.   
10640 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65       char *zMode
10650 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Type = 0;.      
10660 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
10670 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69          int limi
10680 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  t = 0;..        
10690 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d  if( nOpt==5 && m
106a0 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a  emcmp("cache", z
106b0 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 5)==0 ){.  
106c0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
106d0 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
106e0 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  CacheMode[] = {.
106f0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73              { "s
10700 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f  hared",  SQLITE_
10710 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
10720 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
10730 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c  { "private", SQL
10740 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
10750 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20  CACHE },.       
10760 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
10770 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
10780 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
10790 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
107a0 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ACHE|SQLITE_OPEN
107b0 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20  _PRIVATECACHE;. 
107c0 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
107d0 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20   aCacheMode;.   
107e0 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
107f0 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ask;.          z
10800 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68  ModeType = "cach
10810 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e";.        }.  
10820 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
10830 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64  4 && memcmp("mod
10840 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20  e", zOpt, 4)==0 
10850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
10860 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d  tic struct OpenM
10870 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20  ode aOpenMode[] 
10880 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
10890 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f  { "ro",  SQLITE_
108a0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
108b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
108c0 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  rw",  SQLITE_OPE
108d0 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a  N_READWRITE }, .
108e0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
108f0 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  wc", SQLITE_OPEN
10900 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
10910 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
10920 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
10930 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54   "memory", SQLIT
10940 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c  E_OPEN_MEMORY },
10950 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
10960 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
10970 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
10980 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
10990 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49  _READONLY | SQLI
109a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
109b0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
109c0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
109d0 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
109e0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a  TE_OPEN_MEMORY;.
109f0 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
10a00 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20  = aOpenMode;.   
10a10 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
10a20 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20  ask & flags;.   
10a30 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
10a40 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20   = "access";.   
10a50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
10a60 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20  if( aMode ){.   
10a70 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
10a80 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
10a90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10aa0 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69  for(i=0; aMode[i
10ab0 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ].z; i++){.     
10ac0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
10ad0 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  r *z = aMode[i].
10ae0 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  z;.            i
10af0 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33  f( nVal==sqlite3
10b00 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30  Strlen30(z) && 0
10b10 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a  ==memcmp(zVal, z
10b20 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  , nVal) ){.     
10b30 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20           mode = 
10b40 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20  aMode[i].mode;. 
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
10b60 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
10b70 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
10b80 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65          if( mode
10b90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10ba0 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
10bb0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10bc0 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a  no such %s mode:
10bd0 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c   %s", zModeType,
10be0 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
10bf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10c00 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
10c10 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
10c20 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
10c30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
10c40 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45   (mode & ~SQLITE
10c50 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69  _OPEN_MEMORY)>li
10c60 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
10c70 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
10c80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10c90 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f  %s mode not allo
10ca0 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  wed: %s",.      
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61    zModeType, zVa
10ce0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
10cf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d  rc = SQLITE_PERM
10d00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
10d10 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
10d20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10d30 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
10d40 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20  (flags & ~mask) 
10d50 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  | mode;.        
10d60 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
10d70 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56   zOpt = &zVal[nV
10d80 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  al+1];.    }..  
10d90 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65  }else{.    zFile
10da0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
10db0 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69  c(nUri+2);.    i
10dc0 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
10dd0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10de0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c  .    memcpy(zFil
10df0 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  e, zUri, nUri);.
10e00 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20      zFile[nUri] 
10e10 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
10e20 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27  e[nUri+1] = '\0'
10e30 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  ;.    flags &= ~
10e40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
10e50 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d  .  }..  *ppVfs =
10e60 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
10e70 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a  d(zVfs);.  if( *
10e80 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ppVfs==0 ){.    
10e90 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
10ea0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
10eb0 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a  such vfs: %s", z
10ec0 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  Vfs);.    rc = S
10ed0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
10ee0 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a  . parse_uri_out:
10ef0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
10f10 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b  te3_free(zFile);
10f20 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a  .    zFile = 0;.
10f30 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20    }.  *pFlags = 
10f40 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65  flags;.  *pzFile
10f50 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75   = zFile;.  retu
10f60 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
10f70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
10f80 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f  es the work of o
10f90 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73  pening a databas
10fa0 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a  e on behalf of.*
10fb0 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
10fc0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65   and sqlite3_ope
10fd0 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62  n16(). The datab
10fe0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46  ase filename "zF
10ff0 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73  ilename"  .** is
11000 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a   UTF-8 encoded..
11010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
11020 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f  enDatabase(.  co
11030 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
11040 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65  ame, /* Database
11050 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20   filename UTF-8 
11060 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c  encoded */.  sql
11070 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
11080 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
11090 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61  rned database ha
110a0 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ndle */.  unsign
110b0 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  ed int flags,   
110c0 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20   /* Operational 
110d0 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
110e0 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
110f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11100 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29   VFS to use */.)
11110 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c      /* Store all
11140 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65  ocated handle he
11150 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  re */.  int rc; 
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
11180 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
11190 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20  isThreadsafe;   
111a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
111b0 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61  rue for threadsa
111c0 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  fe connections *
111d0 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20  /.  char *zOpen 
111e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
111f0 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
11200 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  argument to pass
11210 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20   to BtreeOpen() 
11220 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  */.  char *zErrM
11230 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sg = 0;         
11240 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
11250 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74  ssage from sqlit
11260 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a  e3ParseUri() */.
11270 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
11280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11290 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
112a0 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
112b0 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
112c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
112d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
112e0 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
112f0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
11300 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
11310 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
11320 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
11330 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
11340 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
11350 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
11360 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
11370 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
11380 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
11390 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
113a0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
113b0 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
113c0 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
113d0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
113e0 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
113f0 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
11400 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
11410 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
11420 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
11430 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
11440 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
11450 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11460 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11480 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
11490 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
114a0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
114b0 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
114c0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
114d0 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
114e0 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
114f0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
11500 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
11510 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
11520 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
11530 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
11540 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
11550 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
11560 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
11570 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
11580 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
11590 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
115a0 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65   & 0x46)==0 ) re
115b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
115c0 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20  SE_BKPT;..  if( 
115d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
115e0 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
115f0 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
11600 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
11610 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
11620 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
11630 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
11640 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
11650 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
11660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
11670 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
11680 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
11690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
116a0 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
116b0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
116c0 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20  FullMutex;.  }. 
116d0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
116e0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
116f0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
11700 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
11710 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
11720 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
11730 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11740 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
11750 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
11760 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
11770 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
11780 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
11790 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
117a0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
117b0 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
117c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
117d0 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
117e0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
117f0 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
11800 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
11810 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
11820 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
11830 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
11840 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
11850 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
11860 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
11870 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11880 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
11890 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
118a0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
118b0 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
118c0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
118d0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
118e0 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
118f0 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
11900 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
11910 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
11920 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
11930 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
11940 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
11950 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11970 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
11980 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
11990 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
119a0 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
119b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
119c0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
119d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
119f0 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
11a00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11a10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
11a20 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
11a30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11a40 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
11a50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11a60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
11a70 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
11a80 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11a90 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
11aa0 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
11ab0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11ac0 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
11ad0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11ae0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
11af0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
11b00 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
11b10 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
11b20 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
11b30 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
11b40 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
11b50 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
11b60 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
11b70 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
11b80 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
11b90 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
11ba0 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a  isThreadsafe ){.
11bb0 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
11bc0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
11bd0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
11be0 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
11bf0 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
11c00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11c10 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
11c20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
11c30 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
11c40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
11c50 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11c60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
11c70 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
11c80 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
11c90 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
11ca0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
11cb0 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
11cc0 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20  ->aDbStatic;..  
11cd0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
11ce0 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
11cf0 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
11d00 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
11d10 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
11d20 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
11d30 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75  imit));.  db->au
11d40 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
11d50 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
11d60 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d  = -1;.  db->szMm
11d70 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ap = sqlite3Glob
11d80 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
11d90 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
11da0 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66  ize = 0;.  db->f
11db0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
11dc0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
11dd0 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20  QLITE_AutoIndex 
11de0 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
11df0 72 69 67 67 65 72 0a 23 69 66 20 53 51 4c 49 54  rigger.#if SQLIT
11e00 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
11e10 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
11e20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
11e30 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
11e40 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
11e50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
11e60 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
11e70 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
11e80 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
11e90 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
11ea0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
11eb0 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
11ee0 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
11ef0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11f00 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
11f10 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
11f20 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
11f30 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
11f40 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
11f50 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
11f60 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
11f70 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
11f80 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
11f90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11fa0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
11fb0 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
11fc0 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
11fd0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
11fe0 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
11ff0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
12000 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
12010 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
12020 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
12030 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
12040 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
12050 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
12060 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
12070 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
12080 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
12090 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
120a0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
120b0 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ..  */.  createC
120c0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
120d0 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
120e0 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  F8, 0, binCollFu
120f0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
12100 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
12110 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
12120 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16BE, 0, binCo
12130 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
12140 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
12150 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
12160 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62  TE_UTF16LE, 0, b
12170 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
12180 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
12190 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
121a0 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
121b0 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
121c0 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
121d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
121e0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
121f0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
12200 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
12210 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
12220 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
12230 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20  "BINARY", 0);.  
12240 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
12250 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
12260 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46  * Also add a UTF
12270 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74  -8 case-insensit
12280 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ive collation se
12290 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65  quence. */.  cre
122a0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
122b0 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54   "NOCASE", SQLIT
122c0 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73  E_UTF8, 0, nocas
122d0 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20  eCollatingFunc, 
122e0 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  0);..  /* Parse 
122f0 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49  the filename/URI
12300 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20   argument. */.  
12310 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  db->openFlags = 
12320 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71  flags;.  rc = sq
12330 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56  lite3ParseUri(zV
12340 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  fs, zFilename, &
12350 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73  flags, &db->pVfs
12360 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d  , &zOpen, &zErrM
12370 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
12380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
123a0 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f  OMEM ) db->mallo
123b0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
123c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
123d0 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20  , rc, zErrMsg ? 
123e0 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73  "%s" : 0, zErrMs
123f0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
12400 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
12410 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
12420 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  ut;.  }..  /* Op
12430 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64  en the backend d
12440 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a  atabase driver *
12450 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
12460 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
12470 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26  fs, zOpen, db, &
12480 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
12490 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
124a0 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
124b0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
124c0 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72  AIN_DB);.  if( r
124d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
124e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
124f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
12500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
12510 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
12520 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12530 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20  r(db, rc, 0);.  
12540 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
12550 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62  t;.  }.  db->aDb
12560 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [0].pSchema = sq
12570 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
12580 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  b, db->aDb[0].pB
12590 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  t);.  db->aDb[1]
125a0 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
125b0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
125c0 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64  0);...  /* The d
125d0 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65  efault safety_le
125e0 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  vel for the main
125f0 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75   database is 'fu
12600 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d  ll'; for the tem
12610 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  p.  ** database 
12620 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68  it is 'NONE'. Th
12630 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  is matches the p
12640 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75  ager layer defau
12650 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62  lts.  .  */.  db
12660 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[0].zName =
12670 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61   "main";.  db->a
12680 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[0].safety_lev
12690 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44  el = 3;.  db->aD
126a0 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65  b[1].zName = "te
126b0 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  mp";.  db->aDb[1
126c0 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
126d0 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63   1;..  db->magic
126e0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
126f0 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  OPEN;.  if( db->
12700 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12710 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
12720 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  out;.  }..  /* R
12730 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c  egister all buil
12740 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20  t-in functions, 
12750 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  but do not attem
12760 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20  pt to read the. 
12770 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68   ** database sch
12780 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73  ema yet. This is
12790 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
127a0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
127b0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
127c0 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a  is accessed..  *
127d0 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  /.  sqlite3Error
127e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
127f0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67  0);.  sqlite3Reg
12800 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63  isterBuiltinFunc
12810 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  tions(db);..  /*
12820 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20   Load automatic 
12830 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74  extensions - ext
12840 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76  ensions that hav
12850 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  e been registere
12860 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  d.  ** using the
12870 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74   sqlite3_automat
12880 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41  ic_extension() A
12890 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  PI..  */.  rc = 
128a0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
128b0 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  db);.  if( rc==S
128c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
128d0 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45  sqlite3AutoLoadE
128e0 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20  xtensions(db);. 
128f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
12900 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20  errcode(db);.   
12910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
12930 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
12940 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
12950 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
12960 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
12970 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12980 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
12990 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69  te3Fts1Init(sqli
129a0 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
129b0 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
129c0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
129d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
129e0 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28  NABLE_FTS2.  if(
129f0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
12a00 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
12a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72  _OK ){.    exter
12a20 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
12a30 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  2Init(sqlite3*);
12a40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12a50 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts2Init(db);. 
12a60 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
12a70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12a80 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS3.  if( !db->
12a90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
12aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12ab0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12ac0 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts3Init(db);. 
12ad0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
12ae0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12af0 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ICU.  if( !db->m
12b00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
12b10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12b20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12b30 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  IcuInit(db);.  }
12b40 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
12b50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54  SQLITE_ENABLE_RT
12b60 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  REE.  if( !db->m
12b70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
12b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
12b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52     rc = sqlite3R
12ba0 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20  treeInit(db);.  
12bb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
12bc0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
12bd0 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c   0);..  /* -DSQL
12be0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
12bf0 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
12c00 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
12c10 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
12c20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
12c30 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
12c40 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
12c50 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
12c60 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
12c70 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
12c80 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
12c90 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
12ca0 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
12cb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
12cc0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
12cd0 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
12ce0 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
12cf0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
12d00 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
12d10 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
12d20 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
12d30 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
12d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12d50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
12d60 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
12d70 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
12d80 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68  ..  /* Enable th
12d90 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c  e lookaside-mall
12da0 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a  oc subsystem */.
12db0 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65    setupLookaside
12dc0 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47  (db, 0, sqlite3G
12dd0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
12de0 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20  okaside,.       
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e10 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29  nfig.nLookaside)
12e20 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  ;..  sqlite3_wal
12e30 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
12e40 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  db, SQLITE_DEFAU
12e50 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  LT_WAL_AUTOCHECK
12e60 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f  POINT);..opendb_
12e70 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
12e80 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66  ree(zOpen);.  if
12e90 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
12ea0 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
12eb0 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
12ec0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  ==0 || sqlite3Gl
12ed0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
12ee0 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
12ef0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12f00 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12f10 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
12f20 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
12f30 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
12f40 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
12f50 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
12f60 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
12f70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
12f80 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
12f90 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
12fa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12fb0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
12fc0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
12fd0 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
12fe0 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
12ff0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
13000 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
13010 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
13020 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  log ){.    /* Op
13030 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c  ening a db handl
13040 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
13050 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e  ter is passed 0.
13060 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41   */.    void *pA
13070 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  rg = sqlite3Glob
13080 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
13090 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
130a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
130b0 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a  llog(pArg, db, z
130c0 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
130d0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
130e0 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
130f0 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (0, rc);.}../*.*
13100 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
13110 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
13120 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
13130 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
13140 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
13150 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
13160 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
13170 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
13180 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
131a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
131b0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
131c0 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
131d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
131e0 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
131f0 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
13200 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
13210 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
13220 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
13230 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
13240 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
13250 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
13260 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
13270 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
13280 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
13290 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
132a0 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
132b0 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
132c0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
132d0 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
132e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
132f0 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
13300 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13310 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
13320 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
13330 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
13340 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
13350 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
13360 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
13370 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
13380 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
13390 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
133a0 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
133b0 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
133c0 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
133d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
133e0 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
133f0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
13400 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ame );.  assert(
13410 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62   ppDb );.  *ppDb
13420 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
13430 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
13440 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
13450 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
13460 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13470 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70  n rc;.#endif.  p
13480 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
13490 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
134a0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
134b0 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  Val, -1, zFilena
134c0 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  me, SQLITE_UTF16
134d0 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53  NATIVE, SQLITE_S
134e0 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e  TATIC);.  zFilen
134f0 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61  ame8 = sqlite3Va
13500 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
13510 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66  LITE_UTF8);.  if
13520 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a  ( zFilename8 ){.
13530 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74      rc = openDat
13540 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38  abase(zFilename8
13550 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
13570 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13580 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
13590 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20  N_CREATE, 0);.  
135a0 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20    assert( *ppDb 
135b0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
135c0 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
135d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
135e0 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a  !DbHasProperty(*
135f0 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  ppDb, 0, DB_Sche
13600 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20  maLoaded) ){.   
13610 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20     ENC(*ppDb) = 
13620 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
13630 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  VE;.    }.  }els
13640 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
13650 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
13660 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
13670 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
13680 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
13690 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69  (0, rc);.}.#endi
136a0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
136b0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
136c0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
136d0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
136e0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
136f0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
13700 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
13710 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
13720 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
13730 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13740 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
13750 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
13760 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
13770 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
13780 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
13790 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
137a0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
137b0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
137c0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
137d0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
137e0 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
137f0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
13800 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63  , zName, (u8)enc
13810 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
13820 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
13830 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
13840 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
13850 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
13860 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
13870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  rc;.}../*.** Reg
13880 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
13890 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
138a0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
138b0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
138c0 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
138d0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a  e_collation_v2(.
138e0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
138f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
13900 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
13910 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
13920 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
13930 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
13940 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
13950 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
13960 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
13970 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
13980 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13990 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
139a0 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
139b0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
139c0 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
139d0 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
139e0 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
139f0 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20  mpare, xDel);.  
13a00 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
13a10 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
13a20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13a30 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
13a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
13a50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13a60 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
13a70 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
13a80 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13a90 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
13aa0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
13ab0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
13ac0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
13ad0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
13ae0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
13af0 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  Name,.  int enc,
13b00 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
13b10 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
13b20 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
13b30 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
13b40 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
13b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13b60 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
13b70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13b80 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
13b90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
13ba0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13bb0 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
13bc0 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
13bd0 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
13be0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
13bf0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b  .  if( zName8 ){
13c00 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65  .    rc = create
13c10 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
13c20 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70  ame8, (u8)enc, p
13c30 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
13c40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
13c50 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29  Free(db, zName8)
13c60 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
13c70 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
13c80 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
13c90 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
13ca0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
13cb0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
13cc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
13cd0 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
13ce0 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
13cf0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
13d00 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
13d10 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
13d20 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
13d30 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
13d40 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
13d50 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
13d60 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
13d70 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
13d80 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74  _needed(.  sqlit
13d90 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
13da0 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
13db0 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
13dc0 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c  eeded)(void*,sql
13dd0 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
13de0 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  ep,const char*).
13df0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
13e00 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
13e10 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
13e20 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65  Needed = xCollNe
13e30 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  eded;.  db->xCol
13e40 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20  lNeeded16 = 0;. 
13e50 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
13e60 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
13e70 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
13e80 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
13e90 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
13ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
13eb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ec0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
13ed0 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
13ee0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
13ef0 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
13f00 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
13f10 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
13f20 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
13f30 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
13f40 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13f50 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
13f60 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
13f70 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20  ion_needed16(.  
13f80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
13f90 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
13fa0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
13fb0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f  CollNeeded16)(vo
13fc0 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
13fd0 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
13fe0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  void*).){.  sqli
13ff0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14000 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
14010 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
14020 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  0;.  db->xCollNe
14030 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65  eded16 = xCollNe
14040 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43  eded16;.  db->pC
14050 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
14060 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
14070 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14080 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
14090 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
140a0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
140b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
140c0 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
140d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
140e0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
140f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
14100 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e   an anachronism.
14110 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75   It used to be u
14120 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66  sed to recover f
14130 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28  rom a.** malloc(
14140 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53  ) failure, but S
14150 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74  QLite now does t
14160 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  his automaticall
14170 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
14180 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
14190 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
141a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
141b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  ndif../*.** Test
141c0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
141d0 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  or not the datab
141e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
141f0 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a  s in autocommit.
14200 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e  ** mode.  Return
14210 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61   TRUE if it is a
14220 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
14230 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64    Autocommit mod
14240 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65  e is on.** by de
14250 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  fault.  Autocomm
14260 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62  it is disabled b
14270 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d  y a BEGIN statem
14280 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65  ent and reenable
14290 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74  d.** by the next
142a0 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
142b0 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20  ACK..**.******* 
142c0 54 48 49 53 20 49 53 20 41 4e 20 45 58 50 45 52  THIS IS AN EXPER
142d0 49 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e 44 20  IMENTAL API AND 
142e0 49 53 20 53 55 42 4a 45 43 54 20 54 4f 20 43 48  IS SUBJECT TO CH
142f0 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69  ANGE ******.*/.i
14300 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
14310 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
14320 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
14330 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b   db->autoCommit;
14340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
14350 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
14360 20 61 72 65 20 73 75 62 74 69 74 75 74 65 73 20   are subtitutes 
14370 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51  for constants SQ
14380 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a  LITE_CORRUPT,.**
14390 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
143a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
143b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e   SQLITE_IOERR an
143c0 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72  d possibly other
143d0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61   error.** consta
143e0 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65  nts.  They serve
143f0 72 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a  r two purposes:.
14400 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76  **.**   1.  Serv
14410 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  e as a convenien
14420 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
14430 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61   breakpoint in a
14440 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20   debugger.**    
14450 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65     to detect whe
14460 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20  n version error 
14470 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72  conditions occur
14480 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49  s..**.**   2.  I
14490 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f  nvoke sqlite3_lo
144a0 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74  g() to provide t
144b0 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c  he source code l
144c0 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  ocation where.**
144d0 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76         a low-lev
144e0 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73  el error is firs
144f0 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69  t detected..*/.i
14500 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
14510 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
14520 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
14530 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14540 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
14550 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
14560 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20  ITE_CORRUPT,.   
14570 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74 61             "data
14580 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
14590 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
145a0 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
145b0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
145c0 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
145d0 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
145e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d  QLITE_CORRUPT;.}
145f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75  .int sqlite3Misu
14600 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  seError(int line
14610 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
14620 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14630 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
14640 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
14650 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20  LITE_MISUSE, .  
14660 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 69 73              "mis
14670 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f  use at line %d o
14680 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20  f [%.10s]",.    
14690 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f            lineno
146a0 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
146b0 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
146c0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
146d0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ;.}.int sqlite3C
146e0 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74  antopenError(int
146f0 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
14700 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
14710 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
14720 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
14730 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  og(SQLITE_CANTOP
14740 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  EN, .           
14750 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20     "cannot open 
14760 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20  file at line %d 
14770 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
14780 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
14790 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
147a0 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
147b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
147c0 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  PEN;.}...#ifndef
147d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
147e0 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
147f0 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  is is a convenie
14800 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74  nce routine that
14810 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
14820 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63   all thread-spec
14830 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72  ific.** data for
14840 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
14850 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
14860 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  d..**.** SQLite 
14870 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74  no longer uses t
14880 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64  hread-specific d
14890 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ata so this rout
148a0 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20  ine is now a.** 
148b0 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65  no-op.  It is re
148c0 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f  tained for histo
148d0 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
148e0 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
148f0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
14900 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e  nup(void){.}.#en
14910 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
14920 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
14930 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
14940 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
14950 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
14960 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
14970 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
14980 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
14990 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  tails..*/.#ifdef
149a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
149b0 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69  OLUMN_METADATA.i
149c0 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  nt sqlite3_table
149d0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
149e0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  /* Connection ha
14a10 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
14a20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20  char *zDbName,  
14a30 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
14a40 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a  e name or NULL *
14a50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
14a60 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  zTableName,     
14a70 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
14a80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14a90 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f  ColumnName,    /
14aa0 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
14ab0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
14ac0 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f  pzDataType,    /
14ad0 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72  * OUTPUT: Declar
14ae0 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a  ed data type */.
14af0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
14b00 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a  zCollSeq,     /*
14b10 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69   OUTPUT: Collati
14b20 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
14b30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e   */.  int *pNotN
14b40 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
14b50 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
14b60 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  e if NOT NULL co
14b70 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20  nstraint exists 
14b80 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61  */.  int *pPrima
14b90 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ryKey,          
14ba0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
14bb0 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20   if column part 
14bc0 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  of PK */.  int *
14bd0 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20  pAutoinc        
14be0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
14bf0 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
14c00 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65   is auto-increme
14c10 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
14c20 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
14c30 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  sg = 0;.  Table 
14c40 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c  *pTab = 0;.  Col
14c50 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
14c60 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68   int iCol;..  ch
14c70 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
14c80 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
14c90 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
14ca0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
14cb0 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
14cc0 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
14cd0 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
14ce0 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
14cf0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
14d00 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
14d10 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
14d20 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
14d30 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
14d40 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
14d50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14d60 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
14d70 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
14d80 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
14d90 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
14da0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
14db0 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
14dc0 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
14dd0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
14de0 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
14df0 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
14e00 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
14e10 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
14e20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
14e30 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
14e40 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
14e50 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
14e60 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
14e70 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73  ested */.  if( s
14e80 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
14e90 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
14ea0 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
14eb0 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43  PKey;.    if( iC
14ec0 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
14ed0 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
14ee0 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20  l[iCol];.    }. 
14ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
14f00 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
14f10 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
14f20 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
14f30 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
14f40 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
14f50 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
14f60 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
14f70 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
14f80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14f90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14fa0 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
14fb0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
14fc0 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   0;.      goto e
14fd0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
14fe0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
14ff0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
15000 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
15010 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
15020 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
15030 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
15040 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
15050 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
15060 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
15070 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
15080 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
15090 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
150a0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
150b0 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
150c0 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
150d0 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
150e0 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
150f0 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
15100 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
15110 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
15120 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
15130 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
15140 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
15150 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
15160 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
15170 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
15180 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
15190 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
151a0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
151b0 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
151c0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
151d0 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
151e0 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
151f0 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70     zDataType = p
15200 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
15210 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
15220 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
15230 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
15240 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
15250 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d  arykey  = (pCol-
15260 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
15270 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b  LAG_PRIMKEY)!=0;
15280 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70  .    autoinc = p
15290 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c  Tab->iPKey==iCol
152a0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
152b0 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
152c0 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65  rement)!=0;.  }e
152d0 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  lse{.    zDataTy
152e0 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
152f0 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d      primarykey =
15300 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a   1;.  }.  if( !z
15310 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a  CollSeq ){.    z
15320 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52  CollSeq = "BINAR
15330 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f  Y";.  }..error_o
15340 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ut:.  sqlite3Btr
15350 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
15360 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68  .  /* Whether th
15370 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
15380 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69  succeeded or fai
15390 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74  led, set the out
153a0 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20  put parameters. 
153b0 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20   ** to whatever 
153c0 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e  their local coun
153d0 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e  terparts contain
153e0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69  . If an error di
153f0 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68  d occur,.  ** th
15400 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63  is has the effec
15410 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c  t of zeroing all
15420 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
15430 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
15440 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44  zDataType ) *pzD
15450 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54  ataType = zDataT
15460 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c  ype;.  if( pzCol
15470 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65  lSeq ) *pzCollSe
15480 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20  q = zCollSeq;.  
15490 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a  if( pNotNull ) *
154a0 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75  pNotNull = notnu
154b0 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61  ll;.  if( pPrima
154c0 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72  ryKey ) *pPrimar
154d0 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65  yKey = primaryke
154e0 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e  y;.  if( pAutoin
154f0 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20  c ) *pAutoinc = 
15500 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20  autoinc;..  if( 
15510 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26  SQLITE_OK==rc &&
15520 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71   !pTab ){.    sq
15530 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15540 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45  zErrMsg);.    zE
15550 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  rrMsg = sqlite3M
15560 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73  Printf(db, "no s
15570 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  uch table column
15580 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65  : %s.%s", zTable
15590 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43  Name,.        zC
155a0 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  olumnName);.    
155b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
155c0 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
155d0 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a  Error(db, rc, (z
155e0 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20  ErrMsg?"%s":0), 
155f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
15600 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
15610 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73  rrMsg);.  rc = s
15620 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
15630 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
15640 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
15650 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
15660 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
15670 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
15680 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
15690 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
156a0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
156b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
156c0 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  _sleep(int ms){.
156d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
156e0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Vfs;.  int rc;. 
156f0 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f   pVfs = sqlite3_
15700 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
15710 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74  f( pVfs==0 ) ret
15720 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  urn 0;..  /* Thi
15730 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
15740 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   in milliseconds
15750 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c  , but the underl
15760 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a  ying OsSleep() .
15770 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69    ** API uses mi
15780 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63  croseconds. Henc
15790 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20  e the 1000's..  
157a0 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74  */.  rc = (sqlit
157b0 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20  e3OsSleep(pVfs, 
157c0 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a  1000*ms)/1000);.
157d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
157e0 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
157f0 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65  disable the exte
15800 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65  nded result code
15810 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
15820 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
15830 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20  t_codes(sqlite3 
15840 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b  *db, int onoff){
15850 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15860 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
15870 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
15880 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66   = onoff ? 0xfff
15890 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20  fffff : 0xff;.  
158a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
158b0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
158c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
158d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  OK;.}../*.** Inv
158e0 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e  oke the xFileCon
158f0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61  trol method on a
15900 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
15910 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
15920 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
15930 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
15940 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
15950 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  me, int op, void
15960 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
15970 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15980 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  ;.  Btree *pBtre
15990 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
159a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
159b0 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d  tex);.  pBtree =
159c0 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
159d0 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
159e0 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  e);.  if( pBtree
159f0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
15a00 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
15a10 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20  e3_file *fd;.   
15a20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15a30 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
15a40 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
15a50 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65  BtreePager(pBtre
15a60 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
15a70 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  pPager!=0 );.   
15a80 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
15a90 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
15aa0 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d      assert( fd!=
15ab0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  0 );.    if( op=
15ac0 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49  =SQLITE_FCNTL_FI
15ad0 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  LE_POINTER ){.  
15ae0 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69      *(sqlite3_fi
15af0 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a  le**)pArg = fd;.
15b00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15b10 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
15b20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  if( fd->pMethods
15b30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
15b40 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
15b50 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
15b60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15b70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15b80 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a  NOTFOUND;.    }.
15b90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15ba0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
15bb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
15bc0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
15bd0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
15be0 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ;   .}../*.** In
15bf0 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
15c00 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
15c10 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
15c20 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
15c30 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
15c40 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
15c50 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
15c60 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74  N_TEST.  va_list
15c70 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
15c80 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
15c90 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  h( op ){..    /*
15ca0 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65  .    ** Save the
15cb0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
15cc0 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20  f the PRNG..    
15cd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
15ce0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
15cf0 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  _SAVE: {.      s
15d00 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74  qlite3PrngSaveSt
15d10 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
15d20 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
15d30 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65  *.    ** Restore
15d40 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
15d50 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61  e PRNG to the la
15d60 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75  st state saved u
15d70 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47  sing.    ** PRNG
15d80 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f  _SAVE.  If PRNG_
15d90 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62  SAVE has never b
15da0 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65  efore been calle
15db0 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  d, then.    ** t
15dc0 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69  his verb acts li
15dd0 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20  ke PRNG_RESET.. 
15de0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15df0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
15e00 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20  RNG_RESTORE: {. 
15e10 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
15e20 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a  RestoreState();.
15e30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e40 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
15e50 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47  * Reset the PRNG
15e60 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69   back to its uni
15e70 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
15e80 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c  .  The next call
15e90 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
15ea0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20  e3_randomness() 
15eb0 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20  will reseed the 
15ec0 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e  PRNG using a sin
15ed0 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  gle call.    ** 
15ee0 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65  to the xRandomne
15ef0 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ss method of the
15f00 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20   default VFS..  
15f10 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
15f20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
15f30 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20  NG_RESET: {.    
15f40 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73    sqlite3PrngRes
15f50 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  etState();.     
15f60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15f70 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
15f80 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
15f90 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20  ol(BITVEC_TEST, 
15fa0 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20  size, program). 
15fb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e     **.    ** Run
15fc0 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20   a test against 
15fd0 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20  a Bitvec object 
15fe0 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72  of size.  The pr
15ff0 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20  ogram argument. 
16000 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61     ** is an arra
16010 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68  y of integers th
16020 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74  at defines the t
16030 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  est.  Return -1 
16040 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f  on a.    ** memo
16050 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
16060 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73  ror, 0 on succes
16070 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s, or non-zero f
16080 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  or an error..   
16090 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69   ** See the sqli
160a0 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
160b0 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74  Test() for addit
160c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
160d0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
160e0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
160f0 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20  RL_BITVEC_TEST: 
16100 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
16110 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
16120 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72  ;.      int *aPr
16130 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
16140 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20  int*);.      rc 
16150 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  = sqlite3BitvecB
16160 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61  uiltinTest(sz, a
16170 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65  Prog);.      bre
16180 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
16190 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
161a0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
161b0 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
161c0 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64  KS, xBegin, xEnd
161d0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
161e0 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74  Register hooks t
161f0 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61  o call to indica
16200 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28  te which malloc(
16210 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20  ) failures .    
16220 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20  ** are benign.. 
16230 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16240 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
16250 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
16260 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  KS: {.      type
16270 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f  def void (*void_
16280 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b  function)(void);
16290 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
162a0 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69  tion xBenignBegi
162b0 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  n;.      void_fu
162c0 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e  nction xBenignEn
162d0 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  d;.      xBenign
162e0 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61  Begin = va_arg(a
162f0 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
16300 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  );.      xBenign
16310 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  End = va_arg(ap,
16320 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
16330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
16340 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28  nignMallocHooks(
16350 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42  xBenignBegin, xB
16360 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20  enignEnd);.     
16370 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16380 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
16390 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
163a0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
163b0 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  RL_PENDING_BYTE,
163c0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29   unsigned int X)
163d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
163e0 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  et the PENDING b
163f0 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  yte to the value
16400 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
16410 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a  , if X>0..    **
16420 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
16430 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72   if X==0.  Retur
16440 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
16450 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a  he pending byte.
16460 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69      ** as it exi
16470 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69  sting before thi
16480 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
16490 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lled..    **.   
164a0 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20   ** IMPORTANT:  
164b0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
164c0 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30  DING byte from 0
164d0 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74  x40000000 result
164e0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69  s in.    ** an i
164f0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61  ncompatible data
16500 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  base file format
16510 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  .  Changing the 
16520 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20  PENDING byte.   
16530 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61   ** while any da
16540 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16550 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74  n is open result
16560 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61  s in undefined a
16570 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65  nd.    ** dilete
16580 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a  rious behavior..
16590 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
165a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
165b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a  PENDING_BYTE: {.
165c0 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49        rc = PENDI
165d0 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66  NG_BYTE;.#ifndef
165e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
165f0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
16600 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65   unsigned int ne
16610 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70  wVal = va_arg(ap
16620 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b  , unsigned int);
16630 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  .        if( new
16640 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e  Val ) sqlite3Pen
16650 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61  dingByte = newVa
16660 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
16670 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
16680 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
16690 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
166a0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
166b0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
166c0 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
166d0 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
166e0 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
166f0 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
16700 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
16710 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  t.    ** assert(
16720 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  ) was enabled at
16730 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
16740 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
16750 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a   assert().    **
16760 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
16770 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
16780 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  ue is true.  If 
16790 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20  X is true and.  
167a0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73    ** assert() is
167b0 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
167c0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
167d0 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20   is zero.  If X 
167e0 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20  is.    ** false 
167f0 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20  and assert() is 
16800 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
16810 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65  e assertion fire
16820 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  s and the.    **
16830 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e   process aborts.
16840 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20    If X is false 
16850 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20  and assert() is 
16860 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
16870 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  he.    ** return
16880 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a   value is zero..
16890 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
168a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
168b0 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20  ASSERT: {.      
168c0 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d  volatile int x =
168d0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
168e0 28 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70  ( (x = va_arg(ap
168f0 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20  ,int))!=0 );.   
16900 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20     rc = x;.     
16910 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
16920 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
16930 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
16940 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
16950 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20  TRL_ALWAYS, int 
16960 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
16970 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
16980 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
16990 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77   test to see how
169a0 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a   the ALWAYS and.
169b0 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63      ** NEVER mac
169c0 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ros were defined
169d0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
169e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
169f0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
16a00 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20   is ALWAYS(X).  
16a10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16a20 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74  he recommended t
16a30 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66  est is X==2.  If
16a40 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
16a50 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61  e is 2, that mea
16a60 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53  ns.    ** ALWAYS
16a70 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
16a80 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61  re both no-op pa
16a90 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
16aa0 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  s, which is the.
16ab0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73      ** default s
16ac0 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  etting.  If the 
16ad0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
16ae0 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29  1, then ALWAYS()
16af0 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a   is either.    *
16b00 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20  * hard-coded to 
16b10 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20  true or else it 
16b20 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61  asserts if its a
16b30 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
16b40 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
16b50 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72  st behavior (har
16b60 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29  d-coded to true)
16b70 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
16b80 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
16b90 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
16ba0 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
16bb0 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e  ) is disabled an
16bc0 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20  d the second.   
16bd0 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73   ** behavior (as
16be0 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75  sert if the argu
16bf0 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29  ment to ALWAYS()
16c00 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68   is false) is th
16c10 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
16c20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
16c30 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
16c40 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65  at assert() is e
16c50 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nabled..    **. 
16c60 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69     ** The run-ti
16c70 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  me test procedur
16c80 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d  e might look som
16c90 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73  ething like this
16ca0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
16cb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
16cc0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
16cd0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
16ce0 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20  YS, 2)==2 ){.   
16cf0 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
16d00 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
16d10 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d   are no-op pass-
16d20 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20  through macros. 
16d30 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69     **    }else i
16d40 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
16d50 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
16d60 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
16d70 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  1) ){.    **    
16d80 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61    // ALWAYS(x) a
16d90 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73  sserts that x is
16da0 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20   true. NEVER(x) 
16db0 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c  asserts x is fal
16dc0 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  se..    **    }e
16dd0 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  lse{.    **     
16de0 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73   // ALWAYS(x) is
16df0 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20   a constant 1.  
16e00 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f  NEVER(x) is a co
16e10 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a  nstant 0..    **
16e20 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20      }.    */.   
16e30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
16e40 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a  TCTRL_ALWAYS: {.
16e50 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
16e60 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
16e70 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28      rc = ALWAYS(
16e80 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
16e90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
16ea0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
16eb0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
16ec0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73  TCTRL_RESERVE, s
16ed0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
16ee0 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
16ef0 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76   Set the nReserv
16f00 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20  e size to N for 
16f10 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
16f20 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
16f30 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  e.    ** connect
16f40 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20  ion db..    */. 
16f50 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
16f60 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
16f70 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16f80 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
16f90 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
16fa0 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
16fb0 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
16fc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16fd0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
16fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
16ff0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64  reeSetPageSize(d
17000 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
17010 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , x, 0);.      s
17020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17030 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
17040 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17050 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
17060 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
17070 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
17080 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73  OPTIMIZATIONS, s
17090 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
170a0 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
170b0 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
170c0 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  le various optim
170d0 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73  izations for tes
170e0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
170f0 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75  The .    ** argu
17100 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d  ment N is a bitm
17110 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74  ask of optimizat
17120 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62  ions to be disab
17130 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c  led.  For normal
17140 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
17150 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e  n N should be 0.
17160 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68    The idea is th
17170 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61  at a test progra
17180 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20  m (like the.    
17190 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73  ** SQL Logic Tes
171a0 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f  t or SLT test mo
171b0 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68  dule) can run th
171c0 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69  e same SQL multi
171d0 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a  ple times.    **
171e0 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70   with various op
171f0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61  timizations disa
17200 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  bled to verify t
17210 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73  hat the same ans
17220 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62  wer.    ** is ob
17230 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20  tained in every 
17240 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
17250 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
17260 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
17270 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ONS: {.      sql
17280 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
17290 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
172a0 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74  .      db->dbOpt
172b0 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61  Flags = (u16)(va
172c0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20  _arg(ap, int) & 
172d0 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62  0xffff);.      b
172e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
172f0 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
17300 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69  WORD.    /* sqli
17310 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
17320 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
17330 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73  _ISKEYWORD, cons
17340 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20  t char *zWord). 
17350 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
17360 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f  zWord is a keywo
17370 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79  rd recognized by
17380 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
17390 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20  n return the.   
173a0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65   ** number of ke
173b0 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a  ywords.  Or if z
173c0 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65  Word is not a ke
173d0 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e  yword, return 0.
173e0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
173f0 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72  This test featur
17400 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
17410 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67  ble in the amalg
17420 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20  amation since.  
17430 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
17440 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20  N_KEYWORD macro 
17450 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69  is not defined i
17460 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53  n this file if S
17470 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20  QLite.    ** is 
17480 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61  built using sepa
17490 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65  rate source file
174a0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
174b0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
174c0 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a  RL_ISKEYWORD: {.
174d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
174e0 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67   *zWord = va_arg
174f0 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
17500 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
17510 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17520 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72  (zWord);.      r
17530 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77  c = (sqlite3Keyw
17540 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f  ordCode((u8*)zWo
17550 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f  rd, n)!=TK_ID) ?
17560 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
17570 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  D : 0;.      bre
17580 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
17590 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65   ..    /* sqlite
175a0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
175b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
175c0 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a  CRATCHMALLOC, sz
175d0 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29 3b  , &pNew, pFree);
175e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50  .    **.    ** P
175f0 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20 73  ass pFree into s
17600 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
17610 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e(). .    ** If 
17620 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61  sz>0 then alloca
17630 74 65 20 61 20 73 63 72 61 74 63 68 20 62 75 66  te a scratch buf
17640 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20  fer into pNew.  
17650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
17660 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
17670 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20  _SCRATCHMALLOC: 
17680 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 46  {.      void *pF
17690 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20  ree, **ppNew;.  
176a0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
176b0 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70    sz = va_arg(ap
176c0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70 70  , int);.      pp
176d0 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  New = va_arg(ap,
176e0 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20   void**);.      
176f0 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28 61  pFree = va_arg(a
17700 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
17710 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65 77   if( sz ) *ppNew
17720 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
17730 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20  hMalloc(sz);.   
17740 20 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63     sqlite3Scratc
17750 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  hFree(pFree);.  
17760 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17770 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
17780 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
17790 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
177a0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
177b0 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20   int onoff);.   
177c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61   **.    ** If pa
177d0 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73  rameter onoff is
177e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69   non-zero, confi
177f0 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65 72  gure the wrapper
17800 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20  s so that all.  
17810 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
17820 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69  calls to localti
17830 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74  me() and variant
17840 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66  s fail. If onoff
17850 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a   is zero,.    **
17860 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69   undo this setti
17870 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
17880 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
17890 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
178a0 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULT: {.      sql
178b0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
178c0 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74  .bLocaltimeFault
178d0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
178e0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
178f0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69  .    }..#if defi
17900 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
17910 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
17920 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
17930 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
17940 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58  LITE_TESTCTRL_EX
17950 50 4c 41 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20  PLAIN_STMT,.    
17960 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17970 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17980 33 5f 73 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68  3_stmt*,const ch
17990 61 72 2a 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  ar**);.    **.  
179a0 20 20 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64    ** If compiled
179b0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45 4e 41   with SQLITE_ENA
179c0 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
179d0 2c 20 65 61 63 68 20 73 71 6c 69 74 65 33 5f 73  , each sqlite3_s
179e0 74 6d 74 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a  tmt holds.    **
179f0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
17a00 65 73 63 72 69 62 65 73 20 74 68 65 20 6f 70 74  escribes the opt
17a10 69 6d 69 7a 65 64 20 70 61 72 73 65 20 74 72 65  imized parse tre
17a20 65 2e 20 20 54 68 69 73 20 74 65 73 74 2d 63 6f  e.  This test-co
17a30 6e 74 72 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74  ntrol.    ** ret
17a40 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
17a50 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 20  o that string.. 
17a60 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
17a70 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 45  QLITE_TESTCTRL_E
17a80 58 50 4c 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20  XPLAIN_STMT: {. 
17a90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
17aa0 74 20 2a 70 53 74 6d 74 20 3d 20 76 61 5f 61 72  t *pStmt = va_ar
17ab0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 73 74  g(ap, sqlite3_st
17ac0 6d 74 2a 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  mt*);.      cons
17ad0 74 20 63 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d  t char **pzRet =
17ae0 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
17af0 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20  t char**);.     
17b00 20 2a 70 7a 52 65 74 20 3d 20 73 71 6c 69 74 65   *pzRet = sqlite
17b10 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e  3VdbeExplanation
17b20 28 28 56 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a  ((Vdbe*)pStmt);.
17b30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17b40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 0a 20   }.#endif..  }. 
17b50 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
17b60 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
17b70 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
17b80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
17b90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
17ba0 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69   a utility routi
17bb0 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46  ne, useful to VF
17bc0 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
17bd0 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a  s, that checks.*
17be0 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61  * to see if a da
17bf0 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20  tabase file was 
17c00 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61  a URI that conta
17c10 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20  ined a specific 
17c20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65  query .** parame
17c30 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f  ter, and if so o
17c40 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  btains the value
17c50 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61   of the query pa
17c60 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
17c70 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
17c80 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c  ument is the fil
17c90 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61  ename pointer pa
17ca0 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f  ssed into the xO
17cb0 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  pen().** method 
17cc0 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65  of a VFS impleme
17cd0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50  ntation.  The zP
17ce0 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73  aram argument is
17cf0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17d00 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
17d10 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68  ter we seek.  Th
17d20 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
17d30 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
17d40 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61  the zParam.** pa
17d50 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78  rameter if it ex
17d60 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61  ists.  If the pa
17d70 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
17d80 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75   exist, this rou
17d90 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
17da0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
17db0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
17dc0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
17dd0 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  eter(const char 
17de0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
17df0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b  t char *zParam){
17e00 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
17e10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17e20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
17e30 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
17e40 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
17e50 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d   while( zFilenam
17e60 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
17e70 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  x = strcmp(zFile
17e80 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
17e90 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
17ea0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17eb0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
17ec0 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72      if( x==0 ) r
17ed0 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
17ee0 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
17ef0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17f00 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
17f10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
17f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17f30 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  n a boolean valu
17f40 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
17f50 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rameter..*/.int 
17f60 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
17f70 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ean(const char *
17f80 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
17f90 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69   char *zParam, i
17fa0 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e  nt bDflt){.  con
17fb0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
17fc0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
17fd0 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
17fe0 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d  aram);.  bDflt =
17ff0 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74   bDflt!=0;.  ret
18000 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47  urn z ? sqlite3G
18010 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66  etBoolean(z, bDf
18020 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a  lt) : bDflt;.}..
18030 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36  /*.** Return a 6
18040 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
18050 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
18060 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71  parameter..*/.sq
18070 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
18080 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20  te3_uri_int64(. 
18090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
180a0 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69  lename,    /* Fi
180b0 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64  lename as passed
180c0 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63   to xOpen */.  c
180d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
180e0 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20  m,       /* URI 
180f0 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74  parameter sought
18100 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
18110 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20  t64 bDflt       
18120 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72  /* return if par
18130 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e  ameter is missin
18140 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  g */.){.  const 
18150 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
18160 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
18170 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
18180 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  m);.  sqlite3_in
18190 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26  t64 v;.  if( z &
181a0 26 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  & sqlite3Atoi64(
181b0 7a 2c 20 26 76 2c 20 73 71 6c 69 74 65 33 53 74  z, &v, sqlite3St
181c0 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
181d0 45 5f 55 54 46 38 29 3d 3d 53 51 4c 49 54 45 5f  E_UTF8)==SQLITE_
181e0 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20  OK ){.    bDflt 
181f0 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = v;.  }.  retur
18200 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bDflt;.}../*.*
18210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72  * Return the Btr
18220 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74  ee pointer ident
18230 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65  ified by zDbName
18240 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
18250 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
18260 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62  Btree *sqlite3Db
18270 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69  NameToBtree(sqli
18280 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
18290 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
182a0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
182b0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
182c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
182d0 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20  aDb[i].pBt.     
182e0 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c  && (zDbName==0 |
182f0 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
18300 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  (zDbName, db->aD
18310 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a  b[i].zName)==0).
18320 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
18330 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  urn db->aDb[i].p
18340 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  Bt;.    }.  }.  
18350 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18360 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
18370 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
18380 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
18390 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
183a0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
183b0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
183c0 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
183d0 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
183e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
183f0 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
18400 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
18410 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
18420 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
18430 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
18440 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
18450 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  pBt) : 0;.}../*.
18460 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64  ** Return 1 if d
18470 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
18480 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61  only or 0 if rea
18490 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e  d/write.  Return
184a0 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63   -1 if.** no suc
184b0 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  h database exist
184c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
184d0 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71  3_db_readonly(sq
184e0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
184f0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
18500 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20  .  Btree *pBt = 
18510 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
18520 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
18530 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
18540 3f 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ? sqlite3PagerIs
18550 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33  readonly(sqlite3
18560 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
18570 20 3a 20 2d 31 3b 0a 7d 0a                        : -1;.}.