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

Artifact 457e5db78d5ed7c6ca776c9dae3d1a36be224ec9:


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 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
6f50: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72  ction is open, r
6f60: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69  oll it back. Thi
6f70: 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74  s also ensures t
6f80: 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20  hat if.  ** any 
6f90: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 73  database schemas
6fa0: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
6fb0: 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d  ied by an uncomm
6fc0: 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
6fd0: 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20  n.  ** they are 
6fe0: 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20  reset. And that 
6ff0: 74 68 65 20 72 65 71 75 69 72 65 64 20 62 2d 74  the required b-t
7000: 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
7010: 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74  d to make.  ** t
7020: 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63  he pager rollbac
7030: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
7040: 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65  et an atomic ope
7050: 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c  ration. */.  sql
7060: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
7070: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
7080: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
7090: 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70  utstanding Savep
70a0: 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e  oint structures.
70b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f   */.  sqlite3Clo
70c0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
70d0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
70e0: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
70f0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28  ctions */.  for(
7100: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
7110: 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  j++){.    struct
7120: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
7130: 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[j];.    if( 
7140: 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pDb->pBt ){.    
7150: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
7160: 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ose(pDb->pBt);. 
7170: 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20       pDb->pBt = 
7180: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d  0;.      if( j!=
7190: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  1 ){.        pDb
71a0: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  ->pSchema = 0;. 
71b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
71c0: 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
71d0: 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61  TEMP schema sepa
71e0: 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20  rately and last 
71f0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  */.  if( db->aDb
7200: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
7210: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
7220: 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d  Clear(db->aDb[1]
7230: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  .pSchema);.  }. 
7240: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
7250: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f  ckList(db);..  /
7260: 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72  * Free up the ar
7270: 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79  ray of auxiliary
7280: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
7290: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
72a0: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
72b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
72c0: 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65  nDb<=2 );.  asse
72d0: 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d  rt( db->aDb==db-
72e0: 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20  >aDbStatic );.. 
72f0: 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64   /* Tell the cod
7300: 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68  e in notify.c th
7310: 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  at the connectio
7320: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64  n no longer hold
7330: 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73  s any.  ** locks
7340: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65   and does not re
7350: 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65  quire any furthe
7360: 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  r unlock-notify 
7370: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
7380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
7390: 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a  ionClosed(db);..
73a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72    for(j=0; j<Arr
73b0: 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63  aySize(db->aFunc
73c0: 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46  .a); j++){.    F
73d0: 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a  uncDef *pNext, *
73e0: 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66  pHash, *p;.    f
73f0: 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61  or(p=db->aFunc.a
7400: 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29  [j]; p; p=pHash)
7410: 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d 20  {.      pHash = 
7420: 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20  p->pHash;.      
7430: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
7440: 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74      functionDest
7450: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  roy(db, p);.    
7460: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
7470: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
7480: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7490: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
74a0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
74b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
74c0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
74d0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
74e0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
74f0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f  Next(i)){.    Co
7500: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
7510: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
7520: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
7530: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64   /* Invoke any d
7540: 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73  estructors regis
7550: 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74  tered for collat
7560: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
7570: 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66  r data. */.    f
7580: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
7590: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
75a0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20  ll[j].xDel ){.  
75b0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78        pColl[j].x
75c0: 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73  Del(pColl[j].pUs
75d0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
75e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
75f0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b  Free(db, pColl);
7600: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
7610: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f  shClear(&db->aCo
7620: 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
7630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7640: 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69  UALTABLE.  for(i
7650: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
7660: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
7670: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
7680: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(i)){.    Mod
7690: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
76a0: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
76b0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
76c0: 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20   pMod->xDestroy 
76d0: 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78  ){.      pMod->x
76e0: 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41  Destroy(pMod->pA
76f0: 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ux);.    }.    s
7700: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7710: 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71   pMod);.  }.  sq
7720: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
7730: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
7740: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45  ndif..  sqlite3E
7750: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
7760: 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c  OK, 0); /* Deall
7770: 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65  ocates any cache
7780: 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e  d error strings.
7790: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45   */.  if( db->pE
77a0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
77b0: 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70  3ValueFree(db->p
77c0: 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Err);.  }.  sqli
77d0: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
77e0: 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d  ns(db);..  db->m
77f0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
7800: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
7810: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
7820: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
7830: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
7840: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
7850: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
7860: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
7870: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
7880: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
7890: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
78a0: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
78b0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
78c0: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
78d0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
78e0: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
78f0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
7900: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
7910: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
7920: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
7930: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
7940: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
7950: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7960: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
7970: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
7980: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
7990: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
79a0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
79b0: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
79c0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
79d0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
79e0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
79f0: 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20  ide.nOut==0 );  
7a00: 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f  /* Fails on a lo
7a10: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c  okaside memory l
7a20: 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  eak */.  if( db-
7a30: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
7a40: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
7a50: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
7a60: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
7a70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7a80: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
7a90: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
7aa0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
7ab0: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
7ac0: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
7ad0: 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75  n.** any open cu
7ae0: 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
7af0: 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22  dated ("tripped"
7b00: 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69   - as in "trippi
7b10: 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20  ng a circuit.** 
7b20: 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61  breaker") and ma
7b30: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69  de to return tri
7b40: 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61  pCode if there a
7b50: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a  re any further.*
7b60: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73  * attempts to us
7b70: 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  e that cursor..*
7b80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
7b90: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
7ba0: 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43  3 *db, int tripC
7bb0: 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ode){.  int i;. 
7bc0: 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30   int inTrans = 0
7bd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7be0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
7bf0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
7c00: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
7c10: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a  nMalloc();..  /*
7c20: 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72   Obtain all b-tr
7c30: 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72  ee mutexes befor
7c40: 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c  e making any cal
7c50: 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62  ls to BtreeRollb
7c60: 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69  ack(). .  ** Thi
7c70: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
7c80: 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
7c90: 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c  action being rol
7ca0: 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a  led back has.  *
7cb0: 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  * modified the d
7cc0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
7cd0: 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  If the b-tree mu
7ce0: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61  texes are not ta
7cf0: 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74  ken.  ** here, t
7d00: 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72  hen another shar
7d10: 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74  ed-cache connect
7d20: 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  ion might sneak 
7d30: 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  in between.  ** 
7d40: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c  the database rol
7d50: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
7d60: 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61   reset, which ca
7d70: 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20  n cause false.  
7d80: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65  ** corruption re
7d90: 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61  ports in some ca
7da0: 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ses.  */.  sqlit
7db0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
7dc0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  db);..  for(i=0;
7dd0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7de0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
7df0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7e00: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
7e10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
7e20: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
7e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72   ){.        inTr
7e40: 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ans = 1;.      }
7e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7e60: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74  reeRollback(p, t
7e70: 72 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 20 20  ripCode);.      
7e80: 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61  db->aDb[i].inTra
7e90: 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ns = 0;.    }.  
7ea0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  }.  sqlite3VtabR
7eb0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73  ollback(db);.  s
7ec0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
7ed0: 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20  alloc();..  if( 
7ee0: 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
7ef0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
7f00: 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  !=0 && db->init.
7f10: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73  busy==0 ){.    s
7f20: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
7f30: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
7f40: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
7f50: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
7f60: 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
7f70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
7f80: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
7f90: 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72  .  /* Any deferr
7fa0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ed constraint vi
7fb0: 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f  olations have no
7fc0: 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  w been resolved.
7fd0: 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72   */.  db->nDefer
7fe0: 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20  redCons = 0;..  
7ff0: 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65  /* If one has be
8000: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69  en configured, i
8010: 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61  nvoke the rollba
8020: 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  ck-hook callback
8030: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52   */.  if( db->xR
8040: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
8050: 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21  && (inTrans || !
8060: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20  db->autoCommit) 
8070: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c  ){.    db->xRoll
8080: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d  backCallback(db-
8090: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a  >pRollbackArg);.
80a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
80b0: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
80c0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
80d0: 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  he name correspo
80e0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72  nding to the err
80f0: 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69  or code.** speci
8100: 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75  fied in the argu
8110: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ment..*/.#if def
8120: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
8130: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
8140: 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 5c 0a  LITE_TEST) || \.
8150: 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49      defined(SQLI
8160: 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43  TE_DEBUG_OS_TRAC
8170: 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  E).const char *s
8180: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e  qlite3ErrName(in
8190: 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t rc){.  const c
81a0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
81b0: 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20    int i, origRc 
81c0: 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = rc;.  for(i=0;
81d0: 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30   i<2 && zName==0
81e0: 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66  ; i++, rc &= 0xf
81f0: 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  f){.    switch( 
8200: 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  rc ){.      case
8210: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
8220: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
8230: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b  e = "SQLITE_OK";
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8260: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
8280: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52  me = "SQLITE_ERR
8290: 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OR";            
82a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
82b0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  se SQLITE_INTERN
82c0: 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  AL:           zN
82d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
82e0: 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20  TERNAL";        
82f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8300: 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a  ase SQLITE_PERM:
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
8320: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
8330: 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERM";           
8340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8350: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
8360: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T:              
8370: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8380: 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20  ABORT";         
8390: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
83a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
83b0: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20  RT_ROLLBACK:    
83c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
83d0: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22  _ABORT_ROLLBACK"
83e0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
83f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
8400: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
8410: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8420: 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20  E_BUSY";        
8430: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8440: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
8450: 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20  USY_RECOVERY:   
8460: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8470: 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59  TE_BUSY_RECOVERY
8480: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8490: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
84a0: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20  LOCKED:         
84b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
84c0: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
84d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
84e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
84f0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
8500: 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CHE: zName = "SQ
8510: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
8520: 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a  EDCACHE";break;.
8530: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8540: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
8550: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8560: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20  QLITE_NOMEM";   
8570: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8580: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8590: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20  TE_READONLY:    
85a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
85b0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
85c0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
85d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
85e0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
85f0: 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20  OVERY:  zName = 
8600: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
8610: 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61  _RECOVERY"; brea
8620: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8630: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
8640: 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  NTLOCK:  zName =
8650: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
8660: 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65  Y_CANTLOCK"; bre
8670: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8680: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
8690: 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20  OLLBACK:  zName 
86a0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
86b0: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  LY_ROLLBACK"; br
86c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
86d0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
86e0: 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  :          zName
86f0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
8700: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         b
8710: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8720: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
8740: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8750: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
8760: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8770: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
8780: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
8790: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
87a0: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
87b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
87c0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
87d0: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
87e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
87f0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
8800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8810: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8820: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
8830: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8840: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
8850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8860: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8870: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
8880: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8890: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
88a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
88b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
88c0: 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
88d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
88e0: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
88f0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8900: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8910: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
8920: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8930: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
8940: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
8950: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8960: 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
8970: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8980: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
8990: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
89a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
89b0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
89c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
89d0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
89e0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
89f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8a00: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
8a10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8a20: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
8a30: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
8a40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8a50: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
8a60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8a70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
8a80: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      break;
8a90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8aa0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
8ab0: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
8ac0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
8ad0: 43 4b 45 44 22 3b 20 20 20 20 20 62 72 65 61 6b  CKED";     break
8ae0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8af0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a  ITE_IOERR_NOMEM:
8b00: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8b10: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  "SQLITE_IOERR_NO
8b20: 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61  MEM";       brea
8b30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8b40: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
8b50: 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  S:       zName =
8b60: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41   "SQLITE_IOERR_A
8b70: 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65  CCESS";      bre
8b80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8b90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
8ba0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20  KRESERVEDLOCK:. 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
8bd0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8be0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
8bf0: 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  EDLOCK"; break;.
8c00: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8c10: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20  E_IOERR_LOCK:   
8c20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8c30: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
8c40: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
8c50: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8c60: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20  TE_IOERR_CLOSE: 
8c70: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8c80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
8c90: 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  SE";       break
8ca0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8cb0: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
8cc0: 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  OSE:    zName = 
8cd0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
8ce0: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61  R_CLOSE";   brea
8cf0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8d00: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
8d10: 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  EN:      zName =
8d20: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
8d30: 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65  HMOPEN";     bre
8d40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8d50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
8d60: 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  IZE:      zName 
8d70: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8d80: 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72  SHMSIZE";     br
8d90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8da0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
8db0: 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65  LOCK:      zName
8dc0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8dd0: 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62  _SHMLOCK";     b
8de0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8df0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
8e00: 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d  MMAP:       zNam
8e10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8e20: 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20  R_SHMMAP";      
8e30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8e40: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8e50: 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EEK:         zNa
8e60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8e70: 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20  RR_SEEK";       
8e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8e90: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8ea0: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e  DELETE_NOENT: zN
8eb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8ec0: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
8ed0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
8ee0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8ef0: 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a  _MMAP:         z
8f00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8f10: 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20  OERR_MMAP";     
8f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f30: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
8f40: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  UPT:            
8f50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8f60: 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  CORRUPT";       
8f70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8f80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
8f90: 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20  RUPT_VTAB:      
8fa0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8fb0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20  _CORRUPT_VTAB"; 
8fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8fd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
8fe0: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
8ff0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9000: 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20  E_NOTFOUND";    
9010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9020: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
9030: 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
9040: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9050: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
9060: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9070: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9080: 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20  CANTOPEN:       
9090: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
90a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20  ITE_CANTOPEN";  
90b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
90c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
90d0: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
90e0: 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  DIR: zName = "SQ
90f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
9100: 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a  TEMPDIR";break;.
9110: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9120: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
9130: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
9140: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
9150: 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b  SDIR";    break;
9160: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9170: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
9180: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
9190: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
91a0: 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b  FULLPATH"; break
91b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
91c0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20  ITE_PROTOCOL:   
91d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
91e0: 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  "SQLITE_PROTOCOL
91f0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
9200: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9210: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
9220: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9230: 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b   "SQLITE_EMPTY";
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9250: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9260: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20  QLITE_SCHEMA:   
9270: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9280: 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  = "SQLITE_SCHEMA
9290: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
92a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
92b0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20  SQLITE_TOOBIG:  
92c0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
92d0: 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49   = "SQLITE_TOOBI
92e0: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  G";            b
92f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9300: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9310: 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  NT:         zNam
9320: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
9330: 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20  TRAINT";        
9340: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9350: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9360: 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61  INT_UNIQUE:  zNa
9370: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9380: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b  STRAINT_UNIQUE";
9390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
93a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
93b0: 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e  AINT_TRIGGER: zN
93c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
93d0: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
93e0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
93f0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9400: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
9410: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9440: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
9450: 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61  EIGNKEY";   brea
9460: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9470: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9480: 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d  CHECK:   zName =
9490: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
94a0: 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65  INT_CHECK";  bre
94b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
94c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
94d0: 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20  _PRIMARYKEY:.   
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9500: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9510: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
9520: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
9530: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9540: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
9550: 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  LL: zName = "SQL
9560: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
9570: 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20  OTNULL";break;. 
9580: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9590: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
95a0: 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20  ITHOOK:.        
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
95d0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
95e0: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20  NT_COMMITHOOK"; 
95f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9600: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9610: 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a  RAINT_VTAB:    z
9620: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9630: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b  ONSTRAINT_VTAB";
9640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9650: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
9660: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a  TRAINT_FUNCTION:
9670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
96a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
96b0: 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  TION";     break
96c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
96d0: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
96e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
96f0: 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48  "SQLITE_MISMATCH
9700: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
9710: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9720: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
9730: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9740: 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22   "SQLITE_MISUSE"
9750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
9760: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9770: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
9780: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9790: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22  = "SQLITE_NOLFS"
97a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
97b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
97c0: 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20  SQLITE_AUTH:    
97d0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
97e0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22   = "SQLITE_AUTH"
97f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
9800: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9810: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20   SQLITE_FORMAT: 
9820: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9830: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d  e = "SQLITE_FORM
9840: 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  AT";            
9850: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9860: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9880: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e  me = "SQLITE_RAN
9890: 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  GE";            
98a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
98b0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
98c0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
98d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
98e0: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
98f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9900: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9920: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
9930: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OW";            
9940: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9950: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
9960: 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  CE:             
9970: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9980: 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20  NOTICE";        
9990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
99a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
99b0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a  ICE_RECOVER_WAL:
99c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
99d0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
99e0: 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  WAL";break;.    
99f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9a00: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
9a10: 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  LBACK:.         
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9a40: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9a50: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b  COVER_ROLLBACK";
9a60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9a70: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
9a80: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  G:            zN
9a90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
9aa0: 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20  RNING";         
9ab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9ac0: 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a  ase SQLITE_DONE:
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9ae0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44  Name = "SQLITE_D
9af0: 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ONE";           
9b00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9b10: 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d    }.  if( zName=
9b20: 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
9b30: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
9b40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9b50: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
9b60: 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45  ), zBuf, "SQLITE
9b70: 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f  _UNKNOWN(%d)", o
9b80: 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d  rigRc);.    zNam
9b90: 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20  e = zBuf;.  }.  
9ba0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
9bb0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
9bc0: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
9bd0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
9be0: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
9bf0: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
9c00: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
9c10: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
9c20: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
9c30: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
9c40: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
9c50: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
9c60: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
9c70: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
9c80: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
9c90: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
9ca0: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
9cb0: 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69  ogic error or mi
9cc0: 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c  ssing database",
9cd0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
9ce0: 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c  NTERNAL    */ 0,
9cf0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
9d00: 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61  ERM        */ "a
9d10: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
9d20: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
9d30: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20   SQLITE_ABORT   
9d40: 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b      */ "callback
9d50: 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79   requested query
9d60: 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20   abort",.    /* 
9d70: 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20  SQLITE_BUSY     
9d80: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
9d90: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
9da0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  /* SQLITE_LOCKED
9db0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
9dc0: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
9dd0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
9de0: 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a  TE_NOMEM       *
9df0: 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  / "out of memory
9e00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
9e10: 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20  _READONLY    */ 
9e20: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
9e30: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
9e40: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
9e50: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
9e60: 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65    */ "interrupte
9e70: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
9e80: 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f  E_IOERR       */
9e90: 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   "disk I/O error
9ea0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
9eb0: 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20  _CORRUPT     */ 
9ec0: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
9ed0: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
9ee0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
9ef0: 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f  E_NOTFOUND    */
9f00: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
9f10: 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ion",.    /* SQL
9f20: 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ITE_FULL        
9f30: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20  */ "database or 
9f40: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20  disk is full",. 
9f50: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e     /* SQLITE_CAN
9f60: 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61  TOPEN    */ "una
9f70: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
9f80: 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20  base file",.    
9f90: 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  /* SQLITE_PROTOC
9fa0: 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e  OL    */ "lockin
9fb0: 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20  g protocol",.   
9fc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
9fd0: 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65         */ "table
9fe0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
9ff0: 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  a",.    /* SQLIT
a000: 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f  E_SCHEMA      */
a010: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
a020: 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a  a has changed",.
a030: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f      /* SQLITE_TO
a040: 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74  OBIG      */ "st
a050: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f  ring or blob too
a060: 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51   big",.    /* SQ
a070: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
a080: 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20   */ "constraint 
a090: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  failed",.    /* 
a0a0: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
a0b0: 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20     */ "datatype 
a0c0: 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f  mismatch",.    /
a0d0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
a0e0: 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79       */ "library
a0f0: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
a100: 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22  out of sequence"
a110: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a120: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
a130: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
a140: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
a150: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
a160: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
a170: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
a180: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
a190: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
a1a0: 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61  */ "auxiliary da
a1b0: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
a1c0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
a1d0: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
a1e0: 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75  */ "bind or colu
a1f0: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
a200: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
a210: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
a220: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e    */ "file is en
a230: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
a240: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
a250: 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
a260: 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77   *zErr = "unknow
a270: 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74  n error";.  swit
a280: 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
a290: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
a2a0: 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20  ROLLBACK: {.    
a2b0: 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20    zErr = "abort 
a2c0: 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22  due to ROLLBACK"
a2d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a2e0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
a2f0: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20  : {.      rc &= 
a300: 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  0xff;.      if( 
a310: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
a320: 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d   rc<ArraySize(aM
a330: 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21  sg) && aMsg[rc]!
a340: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
a350: 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  rr = aMsg[rc];. 
a360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a370: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
a380: 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a  return zErr;.}..
a390: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a3a0: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ne implements a 
a3b0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68  busy callback th
a3c0: 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72  at sleeps and tr
a3d0: 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74  ies.** again unt
a3e0: 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c  il a timeout val
a3f0: 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  ue is reached.  
a400: 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  The timeout valu
a410: 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  e is.** an integ
a420: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  er number of mil
a430: 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64  liseconds passed
a440: 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74   in as the first
a450: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
a460: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a470: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
a480: 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74  lback(. void *pt
a490: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
a4a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
a4b0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20  nection */. int 
a4c0: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20  count           
a4d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a4e0: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
a4f0: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29  s been busy */.)
a500: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
a510: 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28  WIN || (defined(
a520: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
a530: 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73  HAVE_USLEEP).  s
a540: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64  tatic const u8 d
a550: 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  elays[] =.     {
a560: 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35   1, 2, 5, 10, 15
a570: 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32  , 20, 25, 25,  2
a580: 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30  5,  50,  50, 100
a590: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
a5a0: 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d  st u8 totals[] =
a5b0: 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c  .     { 0, 1, 3,
a5c0: 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c    8, 18, 33, 53,
a5d0: 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31   78, 103, 128, 1
a5e0: 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66  78, 228 };.# def
a5f0: 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79  ine NDELAY Array
a600: 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73  Size(delays).  s
a610: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
a620: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
a630: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d  nt timeout = db-
a640: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
a650: 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72  int delay, prior
a660: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  ;..  assert( cou
a670: 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63  nt>=0 );.  if( c
a680: 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b  ount < NDELAY ){
a690: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
a6a0: 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20  ays[count];.    
a6b0: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63  prior = totals[c
a6c0: 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ount];.  }else{.
a6d0: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
a6e0: 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20  ys[NDELAY-1];.  
a6f0: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
a700: 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c  [NDELAY-1] + del
a710: 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41  ay*(count-(NDELA
a720: 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Y-1));.  }.  if(
a730: 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e   prior + delay >
a740: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
a750: 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20  delay = timeout 
a760: 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28  - prior;.    if(
a770: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
a780: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
a790: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
a7a0: 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29  Vfs, delay*1000)
a7b0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
a7c0: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  lse.  sqlite3 *d
a7d0: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
a7e0: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
a7f0: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
a800: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
a810: 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b  t;.  if( (count+
a820: 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75  1)*1000 > timeou
a830: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
a840: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
a850: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
a860: 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65  , 1000000);.  re
a870: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
a880: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
a890: 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61  he given busy ha
a8a0: 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ndler..**.** Thi
a8b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a8c0: 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72  led when an oper
a8d0: 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74  ation failed wit
a8e0: 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20  h a lock..** If 
a8f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
a900: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
a910: 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69  he lock is retri
a920: 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65  ed.  If it.** re
a930: 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65  turns 0, the ope
a940: 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69  ration aborts wi
a950: 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53  th an SQLITE_BUS
a960: 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  Y error..*/.int 
a970: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
a980: 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e  yHandler(BusyHan
a990: 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  dler *p){.  int 
a9a0: 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  rc;.  if( NEVER(
a9b0: 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e  p==0) || p->xFun
a9c0: 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79  c==0 || p->nBusy
a9d0: 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <0 ) return 0;. 
a9e0: 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70   rc = p->xFunc(p
a9f0: 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79  ->pArg, p->nBusy
aa00: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
aa10: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d  {.    p->nBusy =
aa20: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
aa30: 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20    p->nBusy++;.  
aa40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a  }.  return rc; .
aa50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
aa60: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62  utine sets the b
aa70: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  usy callback for
aa80: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
aa90: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
aaa0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
aab0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
aac0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  iven argument..*
aad0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
aae0: 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  sy_handler(.  sq
aaf0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
ab00: 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c   (*xBusy)(void*,
ab10: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
ab20: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
ab30: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ab40: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75  mutex);.  db->bu
ab50: 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20  syHandler.xFunc 
ab60: 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62  = xBusy;.  db->b
ab70: 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20  usyHandler.pArg 
ab80: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
ab90: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
aba0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54  = 0;.  db->busyT
abb0: 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71  imeout = 0;.  sq
abc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
abd0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
abe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
abf0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
ac00: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
ac10: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
ac20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
ac30: 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  ts the progress 
ac40: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
ac50: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
ac60: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
ac70: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
ac80: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
ac90: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70   argument. The p
aca0: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
acb0: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f   will.** be invo
acc0: 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f  ked every nOps o
acd0: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  pcodes..*/.void 
ace0: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
acf0: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
ad00: 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
ad10: 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50  nOps,.  int (*xP
ad20: 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c  rogress)(void*),
ad30: 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29   .  void *pArg.)
ad40: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
ad50: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
ad60: 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30  x);.  if( nOps>0
ad70: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f   ){.    db->xPro
ad80: 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73  gress = xProgres
ad90: 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67  s;.    db->nProg
ada0: 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a  ressOps = nOps;.
adb0: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
adc0: 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d  sArg = pArg;.  }
add0: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50  else{.    db->xP
ade0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
adf0: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
ae00: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70  s = 0;.    db->p
ae10: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b  ProgressArg = 0;
ae20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
ae30: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ae40: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
ae50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ae60: 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20  tine installs a 
ae70: 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e  default busy han
ae80: 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20  dler that waits 
ae90: 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  for the.** speci
aea0: 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d  fied number of m
aeb0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f  illiseconds befo
aec0: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a  re returning 0..
aed0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
aee0: 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69  usy_timeout(sqli
aef0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29  te3 *db, int ms)
af00: 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  {.  if( ms>0 ){.
af10: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
af20: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c  _handler(db, sql
af30: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
af40: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64  llback, (void*)d
af50: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  b);.    db->busy
af60: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
af70: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
af80: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
af90: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
afa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
afb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
afc0: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
afd0: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
afe0: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
aff0: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
b000: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
b010: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
b020: 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69 73  db){.  db->u1.is
b030: 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b  Interrupted = 1;
b040: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
b050: 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63  function is exac
b060: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20  tly the same as 
b070: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
b080: 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70  unction(), excep
b090: 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  t.** that it is 
b0a0: 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63  designed to be c
b0b0: 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61  alled by interna
b0c0: 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66  l code. The diff
b0d0: 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61  erence is.** tha
b0e0: 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  t if a malloc() 
b0f0: 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33  fails in sqlite3
b100: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
b110: 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  (), an error cod
b120: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
b130: 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46   and the mallocF
b140: 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72  ailed flag clear
b150: 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ed. .*/.int sqli
b160: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20  te3CreateFunc(. 
b170: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
b180: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
b190: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
b1a0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
b1b0: 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44  ,.  void *pUserD
b1c0: 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  ata,.  void (*xF
b1d0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
b1e0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
b1f0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
b200: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
b210: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
b220: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
b230: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
b240: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
b250: 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44  ntext*),.  FuncD
b260: 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74  estructor *pDest
b270: 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63  ructor.){.  Func
b280: 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e  Def *p;.  int nN
b290: 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ame;..  assert( 
b2a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b2b0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
b2c0: 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e  .  if( zFunction
b2d0: 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  Name==0 ||.     
b2e0: 20 28 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e   (xFunc && (xFin
b2f0: 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c  al || xStep)) ||
b300: 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20   .      (!xFunc 
b310: 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78  && (xFinal && !x
b320: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
b330: 28 21 78 46 75 6e 63 20 26 26 20 28 21 78 46 69  (!xFunc && (!xFi
b340: 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c  nal && xStep)) |
b350: 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31  |.      (nArg<-1
b360: 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f   || nArg>SQLITE_
b370: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
b380: 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c  ) ||.      (255<
b390: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
b3a0: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
b3b0: 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20  ionName))) ){.  
b3c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b3d0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
b3e0: 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .  .#ifndef SQLI
b3f0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
b400: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
b410: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
b420: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
b430: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
b440: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
b450: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
b460: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
b470: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
b480: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
b490: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
b4a0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
b4b0: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
b4c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
b4d0: 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70  SQLITE_ANY is sp
b4e0: 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72  ecified, add thr
b4f0: 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
b500: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  he function.  **
b510: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
b520: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
b530: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
b540: 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51   ){.    enc = SQ
b550: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
b560: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e  ;.  }else if( en
b570: 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b  c==SQLITE_ANY ){
b580: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
b590: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
b5a0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
b5b0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
b5c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
b5d0: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
b5e0: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
b5f0: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
b600: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
b610: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b620: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b630: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
b640: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
b650: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
b660: 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70  6LE,.          p
b670: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
b680: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
b690: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
b6a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
b6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b6c0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
b6d0: 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51    }.    enc = SQ
b6e0: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
b6f0: 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20  }.#else.  enc = 
b700: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e  SQLITE_UTF8;.#en
b710: 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63  dif.  .  /* Chec
b720: 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  k if an existing
b730: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
b740: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72  ng overridden or
b750: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c   deleted. If so,
b760: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20  .  ** and there 
b770: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
b780: 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  then return SQLI
b790: 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75  TE_BUSY. If a fu
b7a0: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62  nction.  ** is b
b7b0: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f  eing overridden/
b7c0: 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72  deleted but ther
b7d0: 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
b7e0: 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20  VMs, allow the. 
b7f0: 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f   ** operation to
b800: 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e   continue but in
b810: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
b820: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
b830: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  nts..  */.  p = 
b840: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
b850: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
b860: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
b870: 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b  rg, (u8)enc, 0);
b880: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
b890: 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20  PrefEnc==enc && 
b8a0: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b  p->nArg==nArg ){
b8b0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74  .    if( db->act
b8c0: 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20  iveVdbeCnt ){.  
b8d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b8e0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
b8f0: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
b900: 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
b910: 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  ify user-functio
b920: 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  n due to active 
b930: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
b940: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
b950: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b960: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
b970: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
b980: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
b990: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
b9a0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
b9b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20  .    }.  }..  p 
b9c0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
b9d0: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
b9e0: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
b9f0: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31  nArg, (u8)enc, 1
ba00: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c  );.  assert(p ||
ba10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ba20: 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  d);.  if( !p ){.
ba30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ba40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
ba50: 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76  /* If an older v
ba60: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75  ersion of the fu
ba70: 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f  nction with a co
ba80: 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63  nfigured destruc
ba90: 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e  tor is.  ** bein
baa0: 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b  g replaced invok
bab0: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
bac0: 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20   function here. 
bad0: 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73  */.  functionDes
bae0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20  troy(db, p);..  
baf0: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
bb00: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
bb10: 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  or->nRef++;.  }.
bb20: 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72    p->pDestructor
bb30: 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a   = pDestructor;.
bb40: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a    p->flags = 0;.
bb50: 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75    p->xFunc = xFu
bb60: 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d  nc;.  p->xStep =
bb70: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
bb80: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b  nalize = xFinal;
bb90: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
bba0: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70  = pUserData;.  p
bbb0: 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41  ->nArg = (u16)nA
bbc0: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rg;.  return SQL
bbd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
bbe0: 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72   Create new user
bbf0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69   functions..*/.i
bc00: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
bc10: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  e_function(.  sq
bc20: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
bc30: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
bc40: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
bc50: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
bc60: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
bc70: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
bc80: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
bc90: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
bca0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
bcb0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
bcc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
bcd0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
bce0: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
bcf0: 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e  xt*).){.  return
bd00: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
bd10: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
bd20: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
bd30: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
bd40: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30         xFinal, 0
bd70: 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  );.}..int sqlite
bd80: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
bd90: 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  n_v2(.  sqlite3 
bda0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
bdb0: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
bdc0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
bdd0: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
bde0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
bdf0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
be00: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
be10: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
be20: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
be30: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
be40: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
be50: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
be60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
be70: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f    void (*xDestro
be80: 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20  y)(void *).){.  
be90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bea0: 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73  ERROR;.  FuncDes
beb0: 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20  tructor *pArg = 
bec0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
bed0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
bee0: 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74  ex);.  if( xDest
bef0: 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20  roy ){.    pArg 
bf00: 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  = (FuncDestructo
bf10: 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  r *)sqlite3DbMal
bf20: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
bf30: 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  of(FuncDestructo
bf40: 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41  r));.    if( !pA
bf50: 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73  rg ){.      xDes
bf60: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
bf70: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
bf80: 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f     pArg->xDestro
bf90: 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20  y = xDestroy;.  
bfa0: 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74    pArg->pUserDat
bfb0: 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20  a = p;.  }.  rc 
bfc0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
bfd0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  unc(db, zFunc, n
bfe0: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75  Arg, enc, p, xFu
bff0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
c000: 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20  l, pArg);.  if( 
c010: 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52  pArg && pArg->nR
c020: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ef==0 ){.    ass
c030: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
c040: 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72  OK );.    xDestr
c050: 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  oy(p);.    sqlit
c060: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 72  e3DbFree(db, pAr
c070: 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20  g);.  }.. out:. 
c080: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
c090: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
c0a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c0b0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
c0c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c0d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c0e0: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
c0f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
c100: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
c110: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
c120: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
c130: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
c140: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
c150: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
c160: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
c170: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c180: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
c190: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
c1a0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
c1b0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c1c0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
c1d0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
c1e0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
c1f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
c200: 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69   *zFunc8;.  sqli
c210: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c220: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
c230: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
c240: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75  cFailed );.  zFu
c250: 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  nc8 = sqlite3Utf
c260: 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74  16to8(db, zFunct
c270: 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  ionName, -1, SQL
c280: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
c290: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c2a0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
c2b0: 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65  Func8, nArg, eTe
c2c0: 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c  xtRep, p, xFunc,
c2d0: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30   xStep, xFinal,0
c2e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
c2f0: 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a  ee(db, zFunc8);.
c300: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
c310: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
c320: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c330: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
c340: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c350: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
c360: 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75  eclare that a fu
c370: 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
c380: 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20  overloaded by a 
c390: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
c3a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  *.** If the func
c3b0: 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69  tion already exi
c3c0: 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72  sts as a regular
c3d0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
c3e0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
c3f0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
c400: 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  p.  If the funct
c410: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
c420: 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  st, then create.
c430: 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61  ** a new one tha
c440: 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20  t always throws 
c450: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
c460: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76  .  .**.** When v
c470: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
c480: 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20  tend to provide 
c490: 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75  an overloaded fu
c4a0: 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20  nction, they.** 
c4b0: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73  should call this
c4c0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65   routine to make
c4d0: 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c   sure the global
c4e0: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
c4f0: 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75  ..** A global fu
c500: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73  nction must exis
c510: 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e  t in order for n
c520: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74  ame resolution t
c530: 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72  o work.** proper
c540: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
c550: 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
c560: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
c570: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
c580: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
c590: 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e  nArg.){.  int nN
c5a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
c5b0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
c5c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c5d0: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OK;.  sqlite3_mu
c5e0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
c5f0: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
c600: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
c610: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  db, zName, nName
c620: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
c630: 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  TF8, 0)==0 ){.  
c640: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
c650: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61  eateFunc(db, zNa
c660: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
c670: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61    0, sqlite3Inva
c6a0: 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  lidFunction, 0, 
c6b0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  0, 0);.  }.  rc 
c6c0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
c6d0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
c6e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
c6f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
c700: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
c710: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c720: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69  TRACE./*.** Regi
c730: 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e  ster a trace fun
c740: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
c750: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
c760: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
c770: 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75  trace.** is retu
c780: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
c790: 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74  NULL trace funct
c7a0: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
c7b0: 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65  o tracing is exe
c7c0: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
c7d0: 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61  LL.** trace is a
c7e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
c7f0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
c800: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74  nvoked at the st
c810: 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53  art of each.** S
c820: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  QL statement..*/
c830: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74  .void *sqlite3_t
c840: 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62  race(sqlite3 *db
c850: 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29  , void (*xTrace)
c860: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
c870: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
c880: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
c890: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c8a0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
c8b0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
c8c0: 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e  TraceArg;.  db->
c8d0: 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b  xTrace = xTrace;
c8e0: 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
c8f0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
c900: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
c910: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
c920: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a  urn pOld;.}./*.*
c930: 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f  * Register a pro
c940: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  file function.  
c950: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
c960: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
c970: 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66  istered .** prof
c980: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ile function is 
c990: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
c9a0: 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65  * A NULL profile
c9b0: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
c9c0: 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e  that no profilin
c9d0: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
c9e0: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72  A non-NULL.** pr
c9f0: 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74  ofile is a point
ca00: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
ca10: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
ca20: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
ca30: 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51  on of.** each SQ
ca40: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
ca50: 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64   is run..*/.void
ca60: 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c   *sqlite3_profil
ca70: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
ca80: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66  ,.  void (*xProf
ca90: 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ile)(void*,const
caa0: 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69   char*,sqlite_ui
cab0: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
cac0: 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Arg.){.  void *p
cad0: 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Old;.  sqlite3_m
cae0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
caf0: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
cb00: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b  db->pProfileArg;
cb10: 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20  .  db->xProfile 
cb20: 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62  = xProfile;.  db
cb30: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20  ->pProfileArg = 
cb40: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
cb50: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
cb60: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
cb70: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
cb80: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
cb90: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
cba0: 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69  egister a functi
cbb0: 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
cbc0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
cbd0: 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20  ion commits..** 
cbe0: 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66  If the invoked f
cbf0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
cc00: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
cc10: 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65  he commit become
cc20: 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e  s a.** rollback.
cc30: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
cc40: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20  3_commit_hook(. 
cc50: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
cc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
cc70: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
cc80: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
cc90: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
cca0: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a  ack)(void*),  /*
ccb0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   Function to inv
ccc0: 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d  oke on each comm
ccd0: 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  it */.  void *pA
cce0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
ccf0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
cd00: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
cd10: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
cd20: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
cd30: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cd40: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
cd50: 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
cd60: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
cd70: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
cd80: 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
cd90: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
cda0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
cdb0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
cdc0: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
cdd0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
cde0: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
cdf0: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
ce00: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
ce10: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
ce20: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
ce30: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
ce40: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
ce50: 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
ce60: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
ce70: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
ce80: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
ce90: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
cea0: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
ceb0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
cec0: 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
ced0: 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
cee0: 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
cef0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
cf10: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
cf20: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
cf30: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
cf40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
cf50: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
cf60: 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61  pRet = db->pUpda
cf70: 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70  teArg;.  db->xUp
cf80: 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78  dateCallback = x
cf90: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
cfa0: 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  pUpdateArg = pAr
cfb0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
cfc0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cfd0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
cfe0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  et;.}../*.** Reg
cff0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
d000: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
d010: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
d020: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
d030: 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73  .** back by this
d040: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d050: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
d060: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
d070: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
d080: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
d090: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
d0a0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
d0b0: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
d0c0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
d0d0: 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  d*), /* Callback
d0e0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
d0f0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
d100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
d110: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
d120: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
d130: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
d140: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d150: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
d160: 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
d170: 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
d180: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
d190: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
d1a0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
d1b0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
d1c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d1d0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d1e0: 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66   pRet;.}..#ifdef
d1f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
d200: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
d210: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
d220: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
d230: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
d240: 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
d250: 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
d260: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
d270: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
d280: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
d290: 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64   *sqlite3_preupd
d2a0: 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
d2b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d2c0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
d2d0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
d2e0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
d2f0: 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  oid(*xCallback)(
d300: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
d310: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
d320: 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74  .    void*,sqlit
d330: 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  e3*,int,char con
d340: 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c  st*,char const*,
d350: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71  sqlite3_int64,sq
d360: 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20  lite3_int64),.  
d370: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
d380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d390: 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75  st callback argu
d3a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  ment */.){.  voi
d3b0: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
d3c0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d3d0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
d3e0: 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61  t = db->pPreUpda
d3f0: 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  teArg;.  db->xPr
d400: 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  eUpdateCallback 
d410: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
d420: 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
d430: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
d440: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d450: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
d460: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
d470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
d480: 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
d490: 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  OK */..#ifndef S
d4a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
d4b0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
d4c0: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
d4d0: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
d4e0: 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  by sqlite3_wal_a
d4f0: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e  utocheckpoint().
d500: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  .** Invoke sqlit
d510: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
d520: 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
d530: 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
d540: 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20   log file.** is 
d550: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c  greater than sql
d560: 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73  ite3.pWalArg cas
d570: 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
d580: 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69  (the value confi
d590: 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f  gured by.** wal_
d5a0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
d5b0: 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  )..*/ .int sqlit
d5c0: 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
d5d0: 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e  (.  void *pClien
d5e0: 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72  tData,     /* Ar
d5f0: 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  gument */.  sqli
d600: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d610: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
d620: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
d630: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20   *zDb,       /* 
d640: 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  Database */.  in
d650: 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20  t nFrame        
d660: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
d670: 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  WAL */.){.  if( 
d680: 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50  nFrame>=SQLITE_P
d690: 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e  TR_TO_INT(pClien
d6a0: 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71  tData) ){.    sq
d6b0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
d6c0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
d6d0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
d6e0: 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
d6f0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
d700: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
d710: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d720: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
d730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
d740: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69   */../*.** Confi
d750: 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  gure an sqlite3_
d760: 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
d770: 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  ack to automatic
d780: 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a  ally checkpoint.
d790: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66  ** a database af
d7a0: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
d7b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
d7c0: 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65  there are nFrame
d7d0: 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d   or.** more fram
d7e0: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
d7f0: 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f  le. Passing zero
d800: 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76   or a negative v
d810: 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e  alue as the.** n
d820: 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20  Frame parameter 
d830: 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74  disables automat
d840: 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65  ic checkpoints e
d850: 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntirely..**.** T
d860: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  he callback regi
d870: 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  stered by this f
d880: 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73  unction replaces
d890: 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61   any existing ca
d8a0: 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74  llback.** regist
d8b0: 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ered using sqlit
d8c0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c  e3_wal_hook(). L
d8d0: 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65  ikewise, registe
d8e0: 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a  ring a callback.
d8f0: 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
d900: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61  _wal_hook() disa
d910: 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74  bles the automat
d920: 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65  ic checkpoint me
d930: 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69  chanism.** confi
d940: 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75  gured by this fu
d950: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
d960: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
d970: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
d980: 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d  3 *db, int nFram
d990: 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e){.#ifdef SQLIT
d9a0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55  E_OMIT_WAL.  UNU
d9b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
d9c0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
d9d0: 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23  METER(nFrame);.#
d9e0: 65 6c 73 65 0a 20 20 69 66 28 20 6e 46 72 61 6d  else.  if( nFram
d9f0: 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e>0 ){.    sqlit
da00: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
da10: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
da20: 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e  tHook, SQLITE_IN
da30: 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29  T_TO_PTR(nFrame)
da40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
da50: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
da60: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
da70: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
da80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
da90: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
daa0: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
dab0: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
dac0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
dad0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
dae0: 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
daf0: 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74  -log by this dat
db00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
db10: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
db20: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73  e3_wal_hook(.  s
db30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db50: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
db60: 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e  k to this db han
db70: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  dle */.  int(*xC
db80: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c  allback)(void *,
db90: 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
dba0: 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20   char*, int),.  
dbb0: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
dbe0: 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c  t passed to xCal
dbf0: 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69  lback() */.){.#i
dc00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dc10: 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52  T_WAL.  void *pR
dc20: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
dc30: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
dc40: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
dc50: 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62  b->pWalArg;.  db
dc60: 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d  ->xWalCallback =
dc70: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
dc80: 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67  ->pWalArg = pArg
dc90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
dca0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
dcb0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
dcc0: 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  t;.#else.  retur
dcd0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
dce0: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
dcf0: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f  database zDb..*/
dd00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
dd10: 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a  _checkpoint_v2(.
dd20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
dd50: 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
dd60: 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
dd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
dd80: 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  e of attached da
dd90: 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29  tabase (or NULL)
dda0: 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c   */.  int eMode,
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
ddd0: 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c  CHECKPOINT_* val
dde0: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ue */.  int *pnL
ddf0: 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  og,             
de00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
de10: 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20  Size of WAL log 
de20: 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69  in frames */.  i
de30: 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20  nt *pnCkpt      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de50: 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d  * OUT: Total num
de60: 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68  ber of frames ch
de70: 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b  eckpointed */.){
de80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
de90: 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e  MIT_WAL.  return
dea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
deb0: 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  e.  int rc;     
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
dee0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  de */.  int iDb 
def0: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  = SQLITE_MAX_ATT
df00: 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74  ACHED;  /* sqlit
df10: 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f  e3.aDb[] index o
df20: 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69  f db to checkpoi
df30: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74  nt */..  /* Init
df40: 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75  ialize the outpu
df50: 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d  t variables to -
df60: 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  1 in case an err
df70: 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
df80: 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c  if( pnLog ) *pnL
df90: 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  og = -1;.  if( p
dfa0: 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20  nCkpt ) *pnCkpt 
dfb0: 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  = -1;..  assert(
dfc0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
dfd0: 4e 54 5f 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43  NT_FULL>SQLITE_C
dfe0: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
dff0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  E );.  assert( S
e000: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e010: 5f 46 55 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45  _FULL<SQLITE_CHE
e020: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
e030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
e040: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
e050: 41 53 53 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45  ASSIVE+2==SQLITE
e060: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
e070: 41 52 54 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  ART );.  if( eMo
e080: 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de<SQLITE_CHECKP
e090: 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20  OINT_PASSIVE || 
e0a0: 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45  eMode>SQLITE_CHE
e0b0: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
e0c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e0d0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
e0e0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
e0f0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
e100: 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26  x);.  if( zDb &&
e110: 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69   zDb[0] ){.    i
e120: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
e130: 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
e140: 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30  .  }.  if( iDb<0
e150: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
e160: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
e170: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
e180: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75  SQLITE_ERROR, "u
e190: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a  nknown database:
e1a0: 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65   %s", zDb);.  }e
e1b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
e1c0: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
e1d0: 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
e1e0: 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
e1f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e200: 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d  (db, rc, 0);.  }
e210: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
e220: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
e230: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e240: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
e250: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
e260: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
e270: 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
e280: 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20  ase zDb. If zDb 
e290: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74  is NULL, or if t
e2a0: 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f  he buffer zDb po
e2b0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61  ints.** to conta
e2c0: 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  ins a zero-lengt
e2d0: 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74  h string, all at
e2e0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
e2f0: 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f   are .** checkpo
e300: 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inted..*/.int sq
e310: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
e320: 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
e330: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
e340: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
e350: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
e360: 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  int_v2(db, zDb, 
e370: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
e380: 54 5f 50 41 53 53 49 56 45 2c 20 30 2c 20 30 29  T_PASSIVE, 0, 0)
e390: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
e3a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
e3b0: 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f  ** Run a checkpo
e3c0: 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  int on database 
e3d0: 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e  iDb. This is a n
e3e0: 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65  o-op if database
e3f0: 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63   iDb is.** not c
e400: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e  urrently open in
e410: 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
e420: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
e430: 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  n is open on the
e440: 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
e450: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68  checkpointed, th
e460: 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
e470: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
e480: 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63  OCKED and a chec
e490: 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74  kpoint is not at
e4a0: 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20  tempted. If .** 
e4b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
e4c0: 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
e4d0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e  e checkpoint, an
e4e0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
e4f0: 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
e500: 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  ed (i.e. SQLITE_
e510: 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73  IOERR). Otherwis
e520: 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
e530: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e  .** The mutex on
e540: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e550: 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65   db should be he
e560: 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ld by the caller
e570: 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61  . The mutex.** a
e580: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
e590: 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72  he specific b-tr
e5a0: 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  ee being checkpo
e5b0: 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62  inted is taken b
e5c0: 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  y.** this functi
e5d0: 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65  on while the che
e5e0: 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69  ckpoint is runni
e5f0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ng..**.** If iDb
e600: 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54   is passed SQLIT
e610: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20  E_MAX_ATTACHED, 
e620: 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  then all attache
e630: 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a  d databases are.
e640: 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
e650: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
e660: 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
e670: 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
e680: 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61  iately -.** no a
e690: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
e6a0: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79  o checkpoint any
e6b0: 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62   remaining datab
e6c0: 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ases..**.** Para
e6d0: 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f  meter eMode is o
e6e0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
e6f0: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
e700: 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54   FULL or RESTART
e710: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e720: 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
e730: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
e740: 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20   int eMode, int 
e750: 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43  *pnLog, int *pnC
e760: 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  kpt){.  int rc =
e770: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
e780: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
e790: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
e7a0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
e7c0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
e7d0: 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20  hrough attached 
e7e0: 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75  dbs */.  int bBu
e7f0: 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sy = 0;         
e800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e810: 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
e820: 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  has been encount
e830: 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ered */..  asser
e840: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e850: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
e860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
e870: 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d  nLog || *pnLog==
e880: 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -1 );.  assert( 
e890: 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b  !pnCkpt || *pnCk
e8a0: 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72  pt==-1 );..  for
e8b0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20  (i=0; i<db->nDb 
e8c0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
e8d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
e8e0: 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53  i==iDb || iDb==S
e8f0: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
e900: 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ED ){.      rc =
e910: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65   sqlite3BtreeChe
e920: 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  ckpoint(db->aDb[
e930: 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70  i].pBt, eMode, p
e940: 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
e950: 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a       pnLog = 0;.
e960: 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30        pnCkpt = 0
e970: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
e980: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
e990: 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31         bBusy = 1
e9a0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
e9b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
e9c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
e9d0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
e9e0: 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f  E_OK && bBusy) ?
e9f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72   SQLITE_BUSY : r
ea00: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
ea10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
ea20: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
ea30: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
ea40: 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
ea50: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
ea60: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
ea70: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
ea80: 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
ea90: 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
eaa0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
eab0: 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
eac0: 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
ead0: 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
eae0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
eaf0: 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
eb00: 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
eb10: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
eb20: 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
eb30: 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
eb40: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
eb50: 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
eb60: 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
eb70: 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
eb80: 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
eb90: 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
eba0: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
ebb0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
ebc0: 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
ebd0: 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
ebe0: 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
ebf0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
ec00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
ec10: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ec20: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
ec30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec40: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
ec60: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
ec70: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
ec80: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
ecb0: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
ecc0: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
ecf0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
ed00: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
ed10: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
ed20: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
ed30: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
ed40: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
ed50: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
ed60: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
ed80: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
ed90: 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
edd0: 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
ee00: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
ee10: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
ee40: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
ee50: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
ee60: 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
ee70: 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
ee80: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
ee90: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
eea0: 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
eeb0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
eec0: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
eed0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
eee0: 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
eef0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
ef00: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
ef10: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
ef20: 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ==3.  return 1;.
ef30: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
ef40: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c  E_TEMP_STORE<1 |
ef50: 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  | SQLITE_TEMP_ST
ef60: 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30  ORE>3.  return 0
ef70: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ef80: 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
ef90: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
efa0: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
efb0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
efc0: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
efd0: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
efe0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
eff0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
f000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
f010: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
f020: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
f030: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
f040: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
f050: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f060: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
f070: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
f080: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
f090: 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
f0a0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
f0b0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f0c0: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
f0d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f0e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
f0f0: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
f100: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f110: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
f120: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62  e3_value_text(db
f130: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73  ->pErr);.    ass
f140: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
f150: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
f160: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
f170: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
f180: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a  r(db->errCode);.
f190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f1a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f1b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f1c0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
f1d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
f1e0: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TF16./*.** Retur
f1f0: 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  n UTF-16 encoded
f200: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
f210: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
f220: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
f230: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
f240: 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
f250: 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74  3_errmsg16(sqlit
f260: 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
f270: 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f  c const u16 outO
f280: 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  fMem[] = {.    '
f290: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
f2a0: 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27  ', 'o', 'f', ' '
f2b0: 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c  , 'm', 'e', 'm',
f2c0: 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'o', 'r', 'y', 
f2d0: 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
f2e0: 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65  const u16 misuse
f2f0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20  [] = {.    'l', 
f300: 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27  'i', 'b', 'r', '
f310: 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20  a', 'r', 'y', ' 
f320: 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27  ', .    'r', 'o'
f330: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c  , 'u', 't', 'i',
f340: 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20   'n', 'e', ' ', 
f350: 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27  .    'c', 'a', '
f360: 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64  l', 'l', 'e', 'd
f370: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
f380: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
f390: 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20   .    'o', 'f', 
f3a0: 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27  ' ', .    's', '
f3b0: 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65  e', 'q', 'u', 'e
f3c0: 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27  ', 'n', 'c', 'e'
f3d0: 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
f3e0: 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
f3f0: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
f400: 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
f410: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
f420: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f430: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
f440: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
f450: 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
f460: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f470: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f480: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
f490: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f4a0: 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
f4b0: 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
f4c0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
f4d0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
f4e0: 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
f4f0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
f500: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
f510: 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73  (db->pErr, -1, s
f520: 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
f530: 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20  >errCode),.     
f540: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
f550: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
f560: 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  );.      z = sql
f570: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
f580: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
f590: 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c   }.    /* A mall
f5a0: 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61  oc() may have fa
f5b0: 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  iled within the 
f5c0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
f5d0: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20  value_text16(). 
f5e0: 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20     ** above. If 
f5f0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
f600: 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
f610: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
f620: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
f630: 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
f640: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f  re returning. Do
f650: 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20   this directly, 
f660: 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20  instead of via. 
f670: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69     ** sqlite3Api
f680: 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
f690: 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
f6a0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
f6b0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20  or message..    
f6c0: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
f6d0: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d  cFailed = 0;.  }
f6e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f6f0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f700: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
f710: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f720: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
f730: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f740: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
f750: 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ror code generat
f760: 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20  ed by an SQLite 
f770: 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c  routine. If NULL
f780: 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f   is.** passed to
f790: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
f7a0: 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c  we assume a mall
f7b0: 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69  oc() failed duri
f7c0: 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ng sqlite3_open(
f7d0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
f7e0: 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  3_errcode(sqlite
f7f0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
f800: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
f810: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
f820: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
f830: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
f840: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
f850: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
f860: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
f870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
f880: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
f890: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64   db->errCode & d
f8a0: 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e  b->errMask;.}.in
f8b0: 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
f8c0: 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  ed_errcode(sqlit
f8d0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
f8e0: 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
f8f0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
f900: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
f910: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
f920: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
f930: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
f940: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
f950: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
f960: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
f970: 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  n db->errCode;.}
f980: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
f990: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
f9a0: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
f9b0: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
f9c0: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
f9d0: 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c  ument.  For now,
f9e0: 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c   this simply cal
f9f0: 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ls the internal 
fa00: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a  sqlite3ErrStr().
fa10: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
fa20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
fa30: 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72  te3_errstr(int r
fa40: 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  c){.  return sql
fa50: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a  ite3ErrStr(rc);.
fa60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
fa70: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
fa80: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
fa90: 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
faa0: 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
fab0: 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
fac0: 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
fad0: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
fae0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
faf0: 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74  te3* db,.  const
fb00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
fb10: 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a   u8 enc,.  void*
fb20: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
fb30: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
fb40: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
fb50: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
fb60: 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
fb70: 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  id*).){.  CollSe
fb80: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
fb90: 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  enc2;.  int nNam
fba0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
fbb0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20  n30(zName);.  . 
fbc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
fbd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
fbe0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
fbf0: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
fc00: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
fc10: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
fc20: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
fc30: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
fc40: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
fc50: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
fc60: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
fc70: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
fc80: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
fc90: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
fca0: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
fcb0: 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
fcc0: 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
fcd0: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
fce0: 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
fcf0: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
fd00: 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
fd10: 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
fd20: 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
fd30: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
fd40: 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
fd50: 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
fd60: 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
fd70: 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
fd80: 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
fd90: 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
fda0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
fdb0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
fdc0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
fdd0: 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
fde0: 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
fdf0: 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
fe00: 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
fe10: 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
fe20: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
fe30: 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
fe40: 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
fe50: 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
fe60: 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
fe70: 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
fe80: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
fe90: 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   */.  pColl = sq
fea0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
feb0: 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
fec0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
fed0: 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
fee0: 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
fef0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
ff00: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
ff10: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
ff20: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
ff30: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
ff40: 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
ff50: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
ff60: 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
ff70: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
ff80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ff90: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
ffa0: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
ffb0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
ffc0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f  );..    /* If co
ffd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
ffe0: 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74   pColl was creat
fff0: 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61  ed directly by a
10000 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
10010 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
10020 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f  ollation, and no
10030 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  t generated by s
10040 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20  ynthCollSeq(),. 
10050 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63     ** then any c
10060 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79  opies made by sy
10070 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65  nthCollSeq() nee
10080 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61  d to be invalida
10090 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  ted..    ** Also
100a0 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74  , collation dest
100b0 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71  ructor - CollSeq
100c0 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69  .xDel() - functi
100d0 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  on may need.    
100e0 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e  ** to be called.
100f0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28  .    */ .    if(
10100 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e   (pColl->enc & ~
10110 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
10120 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20  GNED)==enc2 ){. 
10130 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43       CollSeq *aC
10140 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
10150 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
10160 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Seq, zName, nNam
10170 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  e);.      int j;
10180 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
10190 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<3; j++){.     
101a0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20     CollSeq *p = 
101b0 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  &aColl[j];.     
101c0 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70     if( p->enc==p
101d0 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
101e0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44         if( p->xD
101f0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  el ){.          
10200 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73    p->xDel(p->pUs
10210 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
10220 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43  .          p->xC
10230 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mp = 0;.        
10240 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10250 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    }..  pColl = s
10260 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
10270 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
10280 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28  zName, 1);.  if(
10290 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75   pColl==0 ) retu
102a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
102b0 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
102c0 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
102d0 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
102e0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
102f0 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
10300 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
10310 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
10320 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
10330 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
10340 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
10350 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
10360 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
10370 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66  * This array def
10380 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20  ines hard upper 
10390 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20  bounds on limit 
103a0 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20  values.  The.** 
103b0 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74  initializer must
103c0 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63   be kept in sync
103d0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
103e0 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66  _LIMIT_*.** #def
103f0 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e  ines in sqlite3.
10400 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  h..*/.static con
10410 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69  st int aHardLimi
10420 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45  t[] = {.  SQLITE
10430 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _MAX_LENGTH,.  S
10440 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
10450 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
10460 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c  AX_COLUMN,.  SQL
10470 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
10480 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
10490 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
104a0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
104b0 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45  DBE_OP,.  SQLITE
104c0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
104d0 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  G,.  SQLITE_MAX_
104e0 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49  ATTACHED,.  SQLI
104f0 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
10500 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  ERN_LENGTH,.  SQ
10510 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
10520 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49  E_NUMBER,.  SQLI
10530 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
10540 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  EPTH,.};../*.** 
10550 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
10560 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
10570 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
10580 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
10590 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
105a0 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
105b0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
105c0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
105d0 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
105e0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
105f0 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
10600 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
10610 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
10620 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
10630 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10640 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
10650 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
10660 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10670 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
10680 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
10690 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
106a0 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
106b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
106c0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
106d0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
106e0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
106f0 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
10700 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
10710 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
10720 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
10730 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
10740 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
10750 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
10760 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10770 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
10780 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
10790 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f  _ARG>1000.# erro
107a0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
107b0 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
107c0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
107d0 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  1000.#endif.#if 
107e0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
107f0 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
10800 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 36 32 0a  MAX_ATTACHED>62.
10810 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10820 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
10830 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
10840 64 20 36 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  d 62.#endif.#if 
10850 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
10860 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
10870 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10880 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
10890 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
108a0 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
108b0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
108c0 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
108d0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
108e0 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
108f0 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
10900 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10910 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
10920 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
10930 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
10940 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
10950 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a  least 1.#endif..
10960 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10970 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
10980 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
10990 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
109a0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
109b0 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
109c0 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
109d0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
109e0 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
109f0 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
10a00 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
10a10 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
10a20 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
10a30 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
10a40 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
10a50 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
10a60 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
10a70 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
10a80 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
10a90 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
10aa0 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
10ab0 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
10ac0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
10ad0 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
10ae0 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
10af0 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a  oldLimit;...  /*
10b00 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10b10 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20  30189-54097 For 
10b20 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67  each limit categ
10b30 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  ory SQLITE_LIMIT
10b40 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65  _NAME.  ** there
10b50 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72   is a hard upper
10b60 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f   bound set at co
10b70 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20  mpile-time by a 
10b80 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20  C preprocessor. 
10b90 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64   ** macro called
10ba0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45   SQLITE_MAX_NAME
10bb0 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22  . (The "_LIMIT_"
10bc0 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20   in the name is 
10bd0 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20  changed to.  ** 
10be0 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20  "_MAX_".).  */. 
10bf0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
10c00 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10c10 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
10c20 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
10c30 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
10c40 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10c50 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  _SQL_LENGTH]==SQ
10c60 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
10c70 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
10c80 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10c90 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
10ca0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  ==SQLITE_MAX_COL
10cb0 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UMN );.  assert(
10cc0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10cd0 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
10ce0 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
10cf0 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20  _EXPR_DEPTH );. 
10d00 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
10d10 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
10d20 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
10d30 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
10d40 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a  MPOUND_SELECT);.
10d50 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
10d60 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
10d70 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49  T_VDBE_OP]==SQLI
10d80 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29  TE_MAX_VDBE_OP )
10d90 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
10da0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
10db0 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
10dc0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  ]==SQLITE_MAX_FU
10dd0 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20  NCTION_ARG );.  
10de0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
10df0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
10e00 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54  ATTACHED]==SQLIT
10e10 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
10e20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
10e30 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
10e40 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
10e50 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20  _LENGTH]==.     
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10e90 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
10ea0 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  N_LENGTH );.  as
10eb0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
10ec0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
10ed0 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d  RIABLE_NUMBER]==
10ee0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
10ef0 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61  BLE_NUMBER);.  a
10f00 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
10f10 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  t[SQLITE_LIMIT_T
10f20 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53  RIGGER_DEPTH]==S
10f30 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
10f40 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
10f50 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ert( SQLITE_LIMI
10f60 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d  T_TRIGGER_DEPTH=
10f70 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  =(SQLITE_N_LIMIT
10f80 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c  -1) );...  if( l
10f90 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
10fa0 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
10fb0 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
10fc0 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
10fd0 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
10fe0 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
10ff0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34     /* IMP: R-524
11020 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20  76-28732 */.    
11030 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
11040 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
11050 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
11060 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
11070 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d  limitId];  /* IM
11080 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34  P: R-51463-25634
11090 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   */.    }.    db
110a0 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
110b0 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
110c0 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
110d0 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
110e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
110f0 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a   R-53341-35419 *
11100 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  /.}../*.** This 
11110 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
11120 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55   to parse both U
11130 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20  RIs and non-URI 
11140 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64  filenames passed
11150 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20   by the.** user 
11160 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
11170 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
11180 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
11190 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61  v2(), and for da
111a0 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73  tabase.** URIs s
111b0 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
111c0 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65   of ATTACH state
111d0 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
111e0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
111f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
11200 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
11210 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28  the VFS to use (
11220 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20  or.** a NULL to 
11230 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61  signify the defa
11240 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20  ult VFS) if the 
11250 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  URI does not con
11260 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22  tain a "vfs=xxx"
11270 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
11280 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
11290 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  argument contain
112a0 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f  s the URI (or no
112b0 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a  n-URI filename).
112c0 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20  ** itself. When 
112d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
112e0 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c   called the *pFl
112f0 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ags variable sho
11300 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74  uld contain.** t
11310 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73  he default flags
11320 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
11330 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74  abase handle wit
11340 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f  h. The value sto
11350 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67  red in.** *pFlag
11360 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64  s may be updated
11370 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11380 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  g if the URI fil
11390 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a  ename contains .
113a0 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f  ** "cache=xxx" o
113b0 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65  r "mode=xxx" que
113c0 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
113d0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
113e0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
113f0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
11400 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69  is case *ppVfs i
11410 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
11420 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61  o.** the VFS tha
11430 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
11440 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
11450 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46  abase file. *pzF
11460 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  ile is set to.**
11470 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
11480 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
11490 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
114a0 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69  le to open. It i
114b0 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
114c0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
114d0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
114e0 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65  ally call sqlite
114f0 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65  3_free() to rele
11500 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
11510 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  er..**.** If an 
11520 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
11530 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  en an SQLite err
11540 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
11550 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73  ned and *pzErrMs
11560 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  g.** may be set 
11570 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
11580 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
11590 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
115a0 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65  age error .** me
115b0 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
115c0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
115d0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
115e0 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
115f0 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
11600 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  er by calling sq
11610 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
11620 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73  .int sqlite3Pars
11630 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68  eUri(.  const ch
11640 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c  ar *zDefaultVfs,
11650 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
11660 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73  o use if no "vfs
11670 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69  =xxx" query opti
11680 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
11690 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20  ar *zUri,       
116a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
116b0 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f  erminated URI to
116c0 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69   parse */.  unsi
116d0 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73  gned int *pFlags
116e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
116f0 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50  N/OUT: SQLITE_OP
11700 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EN_XXX flags */.
11710 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a    sqlite3_vfs **
11720 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  ppVfs,          
11730 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f    /* OUT: VFS to
11740 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20   use */ .  char 
11750 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  **pzFile,       
11760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
11770 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70  T: Filename comp
11780 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a  onent of URI */.
11790 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
117a0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
117b0 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
117c0 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d  message (if rc!=
117d0 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b  SQLITE_OK) */.){
117e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
117f0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
11800 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70  d int flags = *p
11810 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  Flags;.  const c
11820 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66  har *zVfs = zDef
11830 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20  aultVfs;.  char 
11840 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63  *zFile;.  char c
11850 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73  ;.  int nUri = s
11860 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11870 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Uri);..  assert(
11880 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b   *pzErrMsg==0 );
11890 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20  ..  if( ((flags 
118a0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
118b0 49 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  I) || sqlite3Glo
118c0 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
118d0 72 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e  ri) .   && nUri>
118e0 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
118f0 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
11900 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  0 .  ){.    char
11910 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
11920 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
11930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11940 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
11950 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
11960 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
11990 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
119a0 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119c0 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
119d0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
119e0 6e 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  nt nByte = nUri+
119f0 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
11a00 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
11a10 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
11a20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11a30 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
11a40 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
11a50 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
11a60 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
11a70 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
11a80 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
11a90 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
11aa0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
11ab0 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
11ac0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
11ad0 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
11ae0 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
11af0 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
11b00 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
11b10 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
11b20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
11b30 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
11b40 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
11b50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
11b60 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
11b70 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75  he scheme and au
11b80 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73  thority segments
11b90 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a   of the URI. */.
11ba0 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d      if( zUri[5]=
11bb0 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d  ='/' && zUri[6]=
11bc0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='/' ){.      iI
11bd0 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69  n = 7;.      whi
11be0 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
11bf0 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20   zUri[iIn]!='/' 
11c00 29 20 69 49 6e 2b 2b 3b 0a 0a 20 20 20 20 20 20  ) iIn++;..      
11c10 69 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69  if( iIn!=7 && (i
11c20 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70  In!=16 || memcmp
11c30 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a  ("localhost", &z
11c40 55 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20  Uri[7], 9)) ){. 
11c50 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
11c60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
11c70 74 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20  tf("invalid uri 
11c80 61 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22  authority: %.*s"
11c90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
11ca0 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b  In-7, &zUri[7]);
11cb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
11cc0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
11cd0 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
11ce0 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ri_out;.      }.
11cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11d00 20 69 49 6e 20 3d 20 35 3b 0a 20 20 20 20 7d 0a   iIn = 5;.    }.
11d10 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
11d20 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e   filename and an
11d30 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  y query paramete
11d40 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c  rs into the zFil
11d50 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a  e buffer. .    *
11d60 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73 63  * Decode %HH esc
11d70 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20  ape codes along 
11d80 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a  the way. .    **
11d90 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74  .    ** Within t
11da0 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62  his loop, variab
11db0 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62 65  le eState may be
11dc0 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20   set to 0, 1 or 
11dd0 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20  2, depending.   
11de0 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69   ** on the parsi
11df0 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66  ng context. As f
11e00 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20  ollows:.    **. 
11e10 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69     **   0: Parsi
11e20 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20  ng file-name..  
11e30 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e    **   1: Parsin
11e40 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f  g name section o
11e50 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
11e60 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
11e70 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73      **   2: Pars
11e80 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f  ing value sectio
11e90 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
11ea0 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
11eb0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53  r..    */.    eS
11ec0 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68  tate = 0;.    wh
11ed0 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
11ee0 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
11ef0 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b  ' ){.      iIn++
11f00 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
11f10 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  %' .       && sq
11f20 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
11f30 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20  ri[iIn]) .      
11f40 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
11f50 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29  git(zUri[iIn+1])
11f60 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
11f70 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28     int octet = (
11f80 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
11f90 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20  zUri[iIn++]) << 
11fa0 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65  4);.        octe
11fb0 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54  t += sqlite3HexT
11fc0 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
11fd0 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
11fe0 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20  rt( octet>=0 && 
11ff0 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20  octet<256 );.   
12000 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d       if( octet==
12010 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
12020 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
12030 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30   taken when "%00
12040 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e  " appears within
12050 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69   the URI. In thi
12060 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
12070 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c  ase we ignore al
12080 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65  l text in the re
12090 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70  mainder of the p
120a0 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20  ath, name or.   
120b0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
120c0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
120d0 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72  parsed. So ignor
120e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
120f0 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20  aracter.        
12100 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f    ** and skip to
12110 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22   the next "?", "
12120 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70  =" or "&", as ap
12130 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20  propriate. */.  
12140 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
12150 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
12160 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20  0 && c!='#' .   
12170 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
12180 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27  State!=0 || c!='
12190 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ?').            
121a0 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20    && (eState!=1 
121b0 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21  || (c!='=' && c!
121c0 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20  ='&')).         
121d0 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
121e0 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20  =2 || c!='&').  
121f0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12200 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20         iIn++;.  
12210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12220 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12240 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20  c = octet;.     
12250 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
12260 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20  e==1 && (c=='&' 
12270 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20  || c=='=') ){.  
12280 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
12290 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  iOut-1]==0 ){.  
122a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d          /* An em
122b0 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e  pty option name.
122c0 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74   Ignore this opt
122d0 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  ion altogether. 
122e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
122f0 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
12300 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20   zUri[iIn]!='#' 
12310 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d  && zUri[iIn-1]!=
12320 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '&' ) iIn++;.   
12330 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
12340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12350 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b     if( c=='&' ){
12360 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65  .          zFile
12370 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12390 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
123a0 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 2;.        }.
123b0 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
123c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
123d0 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d  eState==0 && c==
123e0 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d  '?') || (eState=
123f0 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b  =2 && c=='&') ){
12400 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
12410 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
12420 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
12430 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
12440 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = c;.    }.    i
12450 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a  f( eState==1 ) z
12460 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
12470 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
12480 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
12490 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
124a0 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a   = '\0';..    /*
124b0 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   Check if there 
124c0 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73  were any options
124d0 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20   specified that 
124e0 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70  should be interp
124f0 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65  reted .    ** he
12500 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74  re. Options that
12510 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64   are interpreted
12520 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76   here include "v
12530 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68  fs" and those th
12540 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  at.    ** corres
12550 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68  pond to flags th
12560 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  at may be passed
12570 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
12580 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a  open_v2().    **
12590 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20   method. */.    
125a0 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71  zOpt = &zFile[sq
125b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
125c0 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ile)+1];.    whi
125d0 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20  le( zOpt[0] ){. 
125e0 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20       int nOpt = 
125f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12600 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61  zOpt);.      cha
12610 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b  r *zVal = &zOpt[
12620 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69  nOpt+1];.      i
12630 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
12640 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b  3Strlen30(zVal);
12650 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74  ..      if( nOpt
12660 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76  ==3 && memcmp("v
12670 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30  fs", zOpt, 3)==0
12680 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73   ){.        zVfs
12690 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = zVal;.      }
126a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
126b0 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a  ruct OpenMode {.
126c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
126d0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20  char *z;.       
126e0 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
126f0 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20       } *aMode = 
12700 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
12710 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a  *zModeType = 0;.
12720 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b          int mask
12730 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
12740 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  t limit = 0;..  
12750 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
12760 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63  5 && memcmp("cac
12770 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30  he", zOpt, 5)==0
12780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
12790 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
127a0 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b  Mode aCacheMode[
127b0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
127c0 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53    { "shared",  S
127d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
127e0 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
127f0 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65        { "private
12800 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
12810 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
12820 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
12830 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
12840 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
12850 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   = SQLITE_OPEN_S
12860 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54  HAREDCACHE|SQLIT
12870 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
12880 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61  CHE;.          a
12890 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64  Mode = aCacheMod
128a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
128b0 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  it = mask;.     
128c0 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
128d0 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20   "cache";.      
128e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
128f0 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d  nOpt==4 && memcm
12900 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20  p("mode", zOpt, 
12910 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
12920 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
12930 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d   OpenMode aOpenM
12940 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
12950 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53        { "ro",  S
12960 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
12970 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  NLY },.         
12980 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49     { "rw",  SQLI
12990 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
129a0 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  E }, .          
129b0 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54    { "rwc", SQLIT
129c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
129d0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
129e0 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20  REATE },.       
129f0 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c       { "memory",
12a00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
12a10 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ORY },.         
12a20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
12a30 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
12a40 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
12a50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
12a60 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
12a70 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
12a80 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
12a90 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
12aa0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  | SQLITE_OPEN_ME
12ab0 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MORY;.          
12ac0 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64  aMode = aOpenMod
12ad0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
12ae0 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67  it = mask & flag
12af0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  s;.          zMo
12b00 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73  deType = "access
12b10 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
12b20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20        if( aMode 
12b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
12b40 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
12b50 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  t mode = 0;.    
12b60 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
12b70 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b  Mode[i].z; i++){
12b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
12b90 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f  st char *z = aMo
12ba0 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20  de[i].z;.       
12bb0 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73       if( nVal==s
12bc0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12bd0 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  ) && 0==memcmp(z
12be0 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b  Val, z, nVal) ){
12bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
12c00 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d  ode = aMode[i].m
12c10 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
12c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12c40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
12c50 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ( mode==0 ){.   
12c60 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
12c70 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
12c80 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73  intf("no such %s
12c90 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64   mode: %s", zMod
12ca0 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
12cb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
12cc0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
12cd0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
12ce0 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
12cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12d00 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e     if( (mode & ~
12d10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
12d20 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  RY)>limit ){.   
12d30 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
12d40 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
12d50 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f  intf("%s mode no
12d60 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a  t allowed: %s",.
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
12da0 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
12db0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12dc0 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20  E_PERM;.        
12dd0 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
12de0 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
12df0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c    }.          fl
12e00 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e  ags = (flags & ~
12e10 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20  mask) | mode;.  
12e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12e30 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  .      zOpt = &z
12e40 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20  Val[nVal+1];.   
12e50 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
12e60 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
12e70 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b  _malloc(nUri+2);
12e80 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
12e90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12ea0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70  NOMEM;.    memcp
12eb0 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e  y(zFile, zUri, n
12ec0 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  Uri);.    zFile[
12ed0 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nUri] = '\0';.  
12ee0 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20    zFile[nUri+1] 
12ef0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67  = '\0';.    flag
12f00 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
12f10 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70  N_URI;.  }..  *p
12f20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
12f30 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
12f40 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29   if( *ppVfs==0 )
12f50 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
12f60 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
12f70 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  f("no such vfs: 
12f80 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  %s", zVfs);.    
12f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
12fa0 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72  R;.  }. parse_ur
12fb0 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  i_out:.  if( rc!
12fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12fd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12fe0 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  File);.    zFile
12ff0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c   = 0;.  }.  *pFl
13000 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a  ags = flags;.  *
13010 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  pzFile = zFile;.
13020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13030 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13040 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
13050 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64  k of opening a d
13060 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c  atabase on behal
13070 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  f of.** sqlite3_
13080 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74  open() and sqlit
13090 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65  e3_open16(). The
130a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
130b0 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20  me "zFilename"  
130c0 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63  .** is UTF-8 enc
130d0 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oded..*/.static 
130e0 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65  int openDatabase
130f0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
13100 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61  zFilename, /* Da
13110 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
13120 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f  UTF-8 encoded */
13130 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
13140 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  b,        /* OUT
13150 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62  : Returned datab
13160 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
13170 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
13180 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74  gs,    /* Operat
13190 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20  ional flags */. 
131a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
131b0 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  s       /* Name 
131c0 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
131d0 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
131e0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
131f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
13200 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e  re allocated han
13210 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
13220 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13240 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
13250 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61    int isThreadsa
13260 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fe;             
13270 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68    /* True for th
13280 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74  readsafe connect
13290 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
132a0 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  zOpen = 0;      
132b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
132c0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74  ename argument t
132d0 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f  o pass to BtreeO
132e0 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  pen() */.  char 
132f0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20  *zErrMsg = 0;   
13300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
13310 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
13320 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
13330 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d  () */..  *ppDb =
13340 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
13350 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
13360 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13370 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
13380 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13390 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  rc;.#endif..  /*
133a0 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73   Only allow sens
133b0 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
133c0 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  s of bits in the
133d0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e   flags argument.
133e0 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e    .  ** Throw an
133f0 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f   error if any no
13400 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74  n-sense combinat
13410 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66  ion is used.  If
13420 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20   we.  ** do not 
13430 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f  block illegal co
13440 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c  mbinations here,
13450 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65   it could trigge
13460 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20  r.  ** assert() 
13470 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65  statements in de
13480 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65  eper layers.  Se
13490 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
134a0 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20  ons.  ** are:.  
134b0 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c  **.  **  1:  SQL
134c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
134d0 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49  Y.  **  2:  SQLI
134e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
134f0 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49  E.  **  6:  SQLI
13500 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13510 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
13520 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73  CREATE.  */.  as
13530 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
13540 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30  N_READONLY  == 0
13550 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x01 );.  assert(
13560 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13570 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29  DWRITE == 0x02 )
13580 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
13590 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20  TE_OPEN_CREATE  
135a0 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74    == 0x04 );.  t
135b0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
135c0 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b  ags&7))==0x02 );
135d0 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a   /* READONLY */.
135e0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
135f0 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34  (flags&7))==0x04
13600 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
13610 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
13620 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
13630 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x40 ); /* READW
13640 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f  RITE | CREATE */
13650 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61  .  if( ((1<<(fla
13660 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d  gs&7)) & 0x46)==
13670 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
13680 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a  E_MISUSE_BKPT;..
13690 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
136a0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
136b0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
136c0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
136d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
136e0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
136f0 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
13700 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
13710 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
13720 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13730 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
13740 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
13750 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
13760 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
13770 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13780 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
13790 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
137a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
137b0 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
137c0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
137d0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
137e0 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
137f0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
13800 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
13810 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
13820 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
13830 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
13840 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
13850 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
13860 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
13870 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
13880 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
13890 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
138a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
138b0 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
138c0 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
138d0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
138e0 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
138f0 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
13900 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
13910 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
13920 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
13930 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
13940 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
13950 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13960 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f  DWRITE, SQLITE_O
13970 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49  PEN_CREATE, SQLI
13980 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
13990 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  CHE,.  ** SQLITE
139a0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
139b0 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73  HE, and some res
139c0 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c  erved bits.  Sil
139d0 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
139e0 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
139f0 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
13a00 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
13a10 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
13a20 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
13a30 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
13a40 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
13a50 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
13a60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
13a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
13a90 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
13aa0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13ab0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
13ac0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13ad0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
13ae0 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
13af0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13b00 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
13b10 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
13b20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13b30 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
13b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13b50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
13b60 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
13b70 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13b80 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
13b90 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
13ba0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
13bb0 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
13bc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13bd0 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
13be0 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
13bf0 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
13c00 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
13c10 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
13c20 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
13c30 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
13c40 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
13c50 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
13c60 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
13c70 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
13c80 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
13c90 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13ca0 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
13cb0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
13cc0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
13cd0 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
13ce0 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
13cf0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
13d00 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
13d10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13d20 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
13d30 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
13d40 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
13d50 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
13d60 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
13d70 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
13d80 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
13d90 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  c;..  assert( si
13da0 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
13db0 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69  ==sizeof(aHardLi
13dc0 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  mit) );.  memcpy
13dd0 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61  (db->aLimit, aHa
13de0 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28  rdLimit, sizeof(
13df0 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20  db->aLimit));.  
13e00 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
13e10 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
13e20 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
13e30 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74  ->szMmap = sqlit
13e40 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
13e50 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78  zMmap;.  db->nex
13e60 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tPagesize = 0;. 
13e70 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
13e80 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
13e90 65 73 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f  es | SQLITE_Auto
13ea0 49 6e 64 65 78 20 7c 20 53 51 4c 49 54 45 5f 45  Index | SQLITE_E
13eb0 6e 61 62 6c 65 54 72 69 67 67 65 72 0a 23 69 66  nableTrigger.#if
13ec0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
13ed0 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13ef0 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
13f00 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
13f10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
13f20 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
13f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f40 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
13f50 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
13f60 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
13f70 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
13f80 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
13f90 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
13fa0 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
13fb0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
13fc0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
13fd0 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53  REIGN_KEYS) && S
13fe0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
13ff0 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20  REIGN_KEYS.     
14000 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
14010 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
14020 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a  .#endif.      ;.
14030 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
14040 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
14050 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14060 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14070 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  LE.  sqlite3Hash
14080 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Init(&db->aModul
14090 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
140a0 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74   Add the default
140b0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
140c0 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41  nce BINARY. BINA
140d0 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  RY works for bot
140e0 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64  h UTF-8.  ** and
140f0 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20   UTF-16, so add 
14100 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61  a version for ea
14110 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20  ch to avoid any 
14120 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a  unnecessary.  **
14130 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68   conversions. Th
14140 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61  e only error tha
14150 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65  t can occur here
14160 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   is a malloc() f
14170 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63  ailure..  */.  c
14180 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
14190 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
141a0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e  ITE_UTF8, 0, bin
141b0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
141c0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
141d0 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
141e0 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c  LITE_UTF16BE, 0,
141f0 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
14200 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
14210 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
14220 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
14230 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
14240 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
14250 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52  llation(db, "RTR
14260 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  IM", SQLITE_UTF8
14270 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43  , (void*)1, binC
14280 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
14290 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
142a0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
142b0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
142c0 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
142d0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
142e0 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
142f0 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20  UTF8, "BINARY", 
14300 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
14310 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
14320 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64  ;..  /* Also add
14330 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e   a UTF-8 case-in
14340 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74  sensitive collat
14350 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f  ion sequence. */
14360 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
14370 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c  on(db, "NOCASE",
14380 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
14390 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
143a0 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  Func, 0);..  /* 
143b0 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61  Parse the filena
143c0 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e  me/URI argument.
143d0 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
143e0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
143f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
14400 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e  Uri(zVfs, zFilen
14410 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62  ame, &flags, &db
14420 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20  ->pVfs, &zOpen, 
14430 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
14440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14450 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
14460 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d  LITE_NOMEM ) db-
14470 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
14480 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  1;.    sqlite3Er
14490 72 6f 72 28 64 62 2c 20 72 63 2c 20 7a 45 72 72  ror(db, rc, zErr
144a0 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
144b0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
144c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
144d0 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  sg);.    goto op
144e0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
144f0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
14500 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
14510 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  iver */.  rc = s
14520 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
14530 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c  db->pVfs, zOpen,
14540 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d   db, &db->aDb[0]
14550 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  .pBt, 0,.       
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
14580 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20  OPEN_MAIN_DB);. 
14590 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
145a0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
145b0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
145c0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
145d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
145e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
145f0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
14600 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  0);.    goto ope
14610 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
14620 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
14630 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
14640 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
14650 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
14660 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
14670 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
14680 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a  t(db, 0);...  /*
14690 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
146a0 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
146b0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
146c0 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74  is 'full'; for t
146d0 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
146e0 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e  abase it is 'NON
146f0 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  E'. This matches
14700 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
14710 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
14720 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
14730 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
14740 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
14750 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20  ty_level = 3;.  
14760 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65  db->aDb[1].zName
14770 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
14780 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
14790 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d  evel = 1;..  db-
147a0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
147b0 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
147c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
147d0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
147e0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
147f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
14800 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
14810 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
14820 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
14830 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
14840 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
14850 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
14860 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
14870 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
14880 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
14890 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
148a0 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
148b0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
148c0 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
148d0 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
148e0 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
148f0 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
14900 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
14910 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
14920 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
14930 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
14940 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
14950 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
14960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
14970 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28  rcode(db);.  if(
14980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
149a0 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28  oLoadExtensions(
149b0 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  db);.    rc = sq
149c0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
149d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
149e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
149f0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
14a00 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  t;.    }.  }..#i
14a10 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14a20 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64  LE_FTS1.  if( !d
14a30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14a40 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
14a50 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  t sqlite3Fts1Ini
14a60 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
14a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
14a80 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
14a90 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
14aa0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32  LITE_ENABLE_FTS2
14ab0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
14ac0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
14ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14ae0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
14af0 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69  te3Fts2Init(sqli
14b00 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
14b10 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
14b20 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
14b30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14b40 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28  NABLE_FTS3.  if(
14b50 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
14b60 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
14b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
14b80 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
14b90 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
14ba0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14bb0 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
14bc0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
14bd0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
14be0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
14bf0 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
14c00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
14c10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14c20 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
14c30 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
14c40 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
14c50 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
14c60 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
14c70 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
14c80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
14c90 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  b, rc, 0);..  /*
14ca0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
14cb0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
14cc0 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
14cd0 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
14ce0 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
14cf0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
14d00 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
14d10 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
14d20 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
14d30 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
14d40 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
14d50 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
14d60 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
14d70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
14d80 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
14d90 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
14da0 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
14db0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
14dc0 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
14dd0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
14de0 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
14df0 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
14e00 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
14e30 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
14e40 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61  #endif..  /* Ena
14e50 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  ble the lookasid
14e60 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  e-malloc subsyst
14e70 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f  em */.  setupLoo
14e80 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71  kaside(db, 0, sq
14e90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
14ea0 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20  g.szLookaside,. 
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
14ed0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
14ee0 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74  aside);..  sqlit
14ef0 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
14f00 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45  point(db, SQLITE
14f10 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54  _DEFAULT_WAL_AUT
14f20 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f  OCHECKPOINT);..o
14f30 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c  pendb_out:.  sql
14f40 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29  ite3_free(zOpen)
14f50 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  ;.  if( db ){.  
14f60 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
14f70 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
14f80 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c  adsafe==0 || sql
14f90 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14fa0 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
14fb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
14fc0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
14fd0 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
14fe0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
14ff0 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
15000 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  db!=0 || rc==SQL
15010 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69  ITE_NOMEM );.  i
15020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
15030 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
15040 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
15050 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    db = 0;.  }els
15060 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
15070 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  _OK ){.    db->m
15080 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
15090 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20  GIC_SICK;.  }.  
150a0 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64  *ppDb = db;.#ifd
150b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
150c0 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
150d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
150e0 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
150f0 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62   /* Opening a db
15100 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
15110 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
15120 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f  sed 0. */.    vo
15130 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74  id *pArg = sqlit
15140 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
15150 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73  SqllogArg;.    s
15160 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15170 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c  ig.xSqllog(pArg,
15180 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   db, zFilename, 
15190 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
151a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
151b0 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
151c0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
151d0 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
151e0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
151f0 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
15200 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
15210 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
15220 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
15230 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
15240 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
15270 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
15280 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
15290 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
152a0 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
152b0 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
152c0 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
152d0 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
152e0 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
152f0 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
15300 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
15310 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
15320 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
15330 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
15340 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15350 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
15360 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
15370 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
15380 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
15390 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
153a0 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  pDb, (unsigned i
153b0 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  nt)flags, zVfs);
153c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
153d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
153e0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
153f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
15400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
15410 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76  pen16(.  const v
15420 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  oid *zFilename, 
15430 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
15440 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  b.){.  char cons
15450 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20  t *zFilename8;  
15460 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e   /* zFilename en
15470 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69  coded in UTF-8 i
15480 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36  nstead of UTF-16
15490 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
154a0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
154b0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
154c0 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61  zFilename );.  a
154d0 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20  ssert( ppDb );. 
154e0 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
154f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15500 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
15510 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
15520 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
15530 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
15540 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  if.  pVal = sqli
15550 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
15560 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
15570 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a  tStr(pVal, -1, z
15580 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45  Filename, SQLITE
15590 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
155a0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
155b0 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c  zFilename8 = sql
155c0 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
155d0 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
155e0 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
155f0 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  e8 ){.    rc = o
15600 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
15610 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20  ename8, ppDb,.  
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
15640 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
15650 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
15660 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
15670 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c  *ppDb || rc==SQL
15680 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
15690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
156a0 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  OK && !DbHasProp
156b0 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44  erty(*ppDb, 0, D
156c0 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
156d0 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70  ){.      ENC(*pp
156e0 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  Db) = SQLITE_UTF
156f0 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a  16NATIVE;.    }.
15700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
15710 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
15720 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c    }.  sqlite3Val
15730 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
15740 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
15750 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
15760 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15770 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
15780 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
15790 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
157a0 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
157b0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
157c0 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
157d0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
157e0 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
157f0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
15800 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
15810 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
15820 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
15830 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
15840 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
15850 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
15860 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
15870 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
15880 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
15890 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
158a0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
158b0 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
158c0 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
158d0 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
158e0 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63  ompare, 0);.  rc
158f0 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
15900 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
15910 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15920 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
15930 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15940 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
15950 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
15960 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
15970 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
15980 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15990 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
159a0 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a  n_v2(.  sqlite3*
159b0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
159c0 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
159d0 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
159e0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
159f0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
15a00 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
15a10 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
15a20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
15a30 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
15a40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15a50 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
15a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
15a70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15a80 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
15a90 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
15aa0 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  me, (u8)enc, pCt
15ab0 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65  x, xCompare, xDe
15ac0 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
15ad0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
15ae0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
15af0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
15b00 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
15b10 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
15b20 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
15b30 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
15b40 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
15b50 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
15b60 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
15b70 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
15b80 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
15b90 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
15ba0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76  * db, .  const v
15bb0 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  oid *zName,.  in
15bc0 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
15bd0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
15be0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
15bf0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
15c00 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
15c10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15c20 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
15c30 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33  Name8;.  sqlite3
15c40 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
15c50 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
15c60 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
15c70 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38  iled );.  zName8
15c80 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
15c90 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  o8(db, zName, -1
15ca0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
15cb0 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61  TIVE);.  if( zNa
15cc0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
15cd0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
15ce0 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29  db, zName8, (u8)
15cf0 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
15d00 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  are, 0);.    sql
15d10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
15d20 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63  Name8);.  }.  rc
15d30 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
15d40 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
15d50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15d60 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
15d70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
15d80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15d90 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
15da0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
15db0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15dc0 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
15dd0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
15de0 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
15df0 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
15e00 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
15e10 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
15e20 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
15e30 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
15e40 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20  lation_needed(. 
15e50 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
15e60 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
15e70 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
15e80 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69  xCollNeeded)(voi
15e90 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
15ea0 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63  eTextRep,const c
15eb0 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74  har*).){.  sqlit
15ec0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
15ed0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
15ee0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
15ef0 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
15f00 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
15f10 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
15f20 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
15f30 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
15f40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15f50 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
15f60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15f70 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
15f80 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
15f90 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
15fa0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
15fb0 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
15fc0 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
15fd0 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
15fe0 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
15ff0 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
16000 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
16010 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
16020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16030 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
16040 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
16050 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
16060 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
16070 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
16080 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
16090 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
160a0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
160b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
160c0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
160d0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
160e0 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78  ded = 0;.  db->x
160f0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78  CollNeeded16 = x
16100 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20  CollNeeded16;.  
16110 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
16120 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
16130 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
16140 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
16150 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
16160 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16170 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
16180 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
16190 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
161a0 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
161b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
161c0 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72  is now an anachr
161d0 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74  onism. It used t
161e0 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63  o be used to rec
161f0 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d  over from a.** m
16200 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
16210 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20   but SQLite now 
16220 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61  does this automa
16230 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  tically..*/.int 
16240 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
16250 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20  ecover(void){.  
16260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16270 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16280 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68  * Test to see wh
16290 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
162a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
162b0 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63  tion is in autoc
162c0 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20  ommit.** mode.  
162d0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
162e0 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69  t is and FALSE i
162f0 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  f not.  Autocomm
16300 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a  it mode is on.**
16310 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75   by default.  Au
16320 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61  tocommit is disa
16330 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20  bled by a BEGIN 
16340 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
16350 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68  enabled.** by th
16360 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72  e next COMMIT or
16370 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a   ROLLBACK..**.**
16380 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e  ***** THIS IS AN
16390 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50   EXPERIMENTAL AP
163a0 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54  I AND IS SUBJECT
163b0 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a   TO CHANGE *****
163c0 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
163d0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
163e0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
163f0 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
16400 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ommit;.}../*.** 
16410 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
16420 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69  utines are subti
16430 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61  tutes for consta
16440 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  nts SQLITE_CORRU
16450 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  PT,.** SQLITE_MI
16460 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  SUSE, SQLITE_CAN
16470 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f  TOPEN, SQLITE_IO
16480 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ERR and possibly
16490 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
164a0 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79  constants.  They
164b0 20 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70   server two purp
164c0 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  oses:.**.**   1.
164d0 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e    Serve as a con
164e0 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
164f0 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
16500 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a  t in a debugger.
16510 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65  **       to dete
16520 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20  ct when version 
16530 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
16540 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20   occurs..**.**  
16550 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69   2.  Invoke sqli
16560 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f  te3_log() to pro
16570 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20  vide the source 
16580 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68  code location wh
16590 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c  ere.**       a l
165a0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69  ow-level error i
165b0 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
165c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
165d0 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
165e0 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
165f0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
16600 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
16610 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
16620 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  og(SQLITE_CORRUP
16630 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
16640 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75   "database corru
16650 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64  ption at line %d
16660 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
16670 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
16680 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
16690 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
166a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
166b0 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  UPT;.}.int sqlit
166c0 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
166d0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
166e0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
166f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
16700 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
16710 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  log(SQLITE_MISUS
16720 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
16730 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e    "misuse at lin
16740 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
16750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16760 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
16770 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
16780 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16790 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71  MISUSE;.}.int sq
167a0 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72  lite3CantopenErr
167b0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
167c0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
167d0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
167e0 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
167f0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
16800 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20  CANTOPEN, .     
16810 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
16820 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69   open file at li
16830 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
16840 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16850 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
16860 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
16870 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16880 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23  _CANTOPEN;.}...#
16890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
168a0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
168b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
168c0 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
168d0 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
168e0 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
168f0 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
16900 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
16910 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
16920 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
16930 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
16940 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
16950 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
16960 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
16970 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
16980 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
16990 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
169a0 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
169b0 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
169c0 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
169d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
169e0 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
169f0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
16a00 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
16a10 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
16a20 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
16a30 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
16a40 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
16a50 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
16a60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16a70 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
16a80 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33  DATA.int sqlite3
16a90 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
16aa0 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65  tadata(.  sqlite
16ab0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
16ac0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
16ad0 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ion handle */.  
16ae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
16af0 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44  ame,        /* D
16b00 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20  atabase name or 
16b10 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
16b20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
16b30 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e  ,     /* Table n
16b40 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
16b50 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  har *zColumnName
16b60 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ,    /* Column n
16b70 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ame */.  char co
16b80 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65  nst **pzDataType
16b90 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20  ,    /* OUTPUT: 
16ba0 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79  Declared data ty
16bb0 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  pe */.  char con
16bc0 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20  st **pzCollSeq, 
16bd0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43      /* OUTPUT: C
16be0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16bf0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
16c00 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20  *pNotNull,      
16c10 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
16c20 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e  T: True if NOT N
16c30 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ULL constraint e
16c40 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  xists */.  int *
16c50 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20  pPrimaryKey,    
16c60 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
16c70 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
16c80 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20   part of PK */. 
16c90 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20   int *pAutoinc  
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16cb0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
16cc0 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69  column is auto-i
16cd0 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  ncrement */.){. 
16ce0 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
16cf0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
16d00 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
16d10 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20  .  Column *pCol 
16d20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  = 0;.  int iCol;
16d30 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ..  char const *
16d40 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20  zDataType = 0;. 
16d50 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
16d60 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74  llSeq = 0;.  int
16d70 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20   notnull = 0;.  
16d80 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d  int primarykey =
16d90 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e   0;.  int autoin
16da0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73  c = 0;..  /* Ens
16db0 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
16dc0 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e   schema has been
16dd0 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c   loaded */.  sql
16de0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16df0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
16e00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16e10 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  All(db);.  rc = 
16e20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20  sqlite3Init(db, 
16e30 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
16e40 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
16e50 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  {.    goto error
16e60 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
16e70 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
16e80 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a   in question */.
16e90 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
16ea0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
16eb0 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  ableName, zDbNam
16ec0 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20  e);.  if( !pTab 
16ed0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
16ee0 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30   ){.    pTab = 0
16ef0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ;.    goto error
16f00 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
16f10 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Find the column 
16f20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69  for which info i
16f30 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  s requested */. 
16f40 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f   if( sqlite3IsRo
16f50 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  wid(zColumnName)
16f60 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
16f70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
16f80 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
16f90 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
16fa0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
16fb0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
16fc0 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
16fd0 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
16fe0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43  Col++){.      pC
16ff0 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
17000 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iCol];.      if
17010 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
17020 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
17030 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b   zColumnName) ){
17040 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17060 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62    if( iCol==pTab
17070 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
17080 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
17090 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
170a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
170b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
170c0 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d  ock stores the m
170d0 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
170e0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
170f0 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68  urned.  ** to th
17100 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61  e caller in loca
17110 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74  l variables zDat
17120 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c  aType, zCollSeq,
17130 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72   notnull, primar
17140 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75  ykey.  ** and au
17150 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70  toinc. At this p
17160 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74  oint there are t
17170 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  wo possibilities
17180 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
17190 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65   1. The specifie
171a0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61  d column name wa
171b0 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20  s rowid", "oid" 
171c0 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20  or "_rowid_" .  
171d0 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68  **        and th
171e0 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63  ere is no explic
171f0 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50  itly declared IP
17200 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a  K column. .  **.
17210 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20    **     2. The 
17220 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76  table is not a v
17230 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  iew and the colu
17240 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69  mn name identifi
17250 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20  ed an .  **     
17260 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65     explicitly de
17270 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43  clared column. C
17280 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  opy meta informa
17290 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e  tion from *pCol.
172a0 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f  .  */ .  if( pCo
172b0 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  l ){.    zDataTy
172c0 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  pe = pCol->zType
172d0 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  ;.    zCollSeq =
172e0 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20   pCol->zColl;.  
172f0 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c    notnull = pCol
17300 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20  ->notNull!=0;.  
17310 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20    primarykey  = 
17320 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20  (pCol->colFlags 
17330 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
17340 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69  Y)!=0;.    autoi
17350 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  nc = pTab->iPKey
17360 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d  ==iCol && (pTab-
17370 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
17380 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
17390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
173a0 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45  DataType = "INTE
173b0 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72  GER";.    primar
173c0 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ykey = 1;.  }.  
173d0 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b  if( !zCollSeq ){
173e0 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
173f0 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65  "BINARY";.  }..e
17400 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
17410 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
17420 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74  (db);..  /* Whet
17430 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  her the function
17440 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20   call succeeded 
17450 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74  or failed, set t
17460 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
17470 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61  ters.  ** to wha
17480 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61  tever their loca
17490 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63  l counterparts c
174a0 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72  ontain. If an er
174b0 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20  ror did occur,. 
174c0 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65   ** this has the
174d0 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69   effect of zeroi
174e0 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61  ng all output pa
174f0 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
17500 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20   if( pzDataType 
17510 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20  ) *pzDataType = 
17520 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28  zDataType;.  if(
17530 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a   pzCollSeq ) *pz
17540 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53  CollSeq = zCollS
17550 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75  eq;.  if( pNotNu
17560 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d  ll ) *pNotNull =
17570 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20   notnull;.  if( 
17580 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70  pPrimaryKey ) *p
17590 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69  PrimaryKey = pri
175a0 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70  marykey;.  if( p
175b0 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f  Autoinc ) *pAuto
175c0 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a  inc = autoinc;..
175d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
175e0 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a  =rc && !pTab ){.
175f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17600 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
17610 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
17620 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
17630 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20   "no such table 
17640 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20  column: %s.%s", 
17650 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20  zTableName,.    
17660 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29      zColumnName)
17670 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
17680 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  E_ERROR;.  }.  s
17690 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
176a0 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73  rc, (zErrMsg?"%s
176b0 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  ":0), zErrMsg);.
176c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
176d0 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
176e0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
176f0 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
17700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17710 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
17720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
17730 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ndif../*.** Slee
17740 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
17750 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
17760 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
17770 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
17780 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74  qlite3_sleep(int
17790 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   ms){.  sqlite3_
177a0 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74  vfs *pVfs;.  int
177b0 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71   rc;.  pVfs = sq
177c0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
177d0 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30  );.  if( pVfs==0
177e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
177f0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
17800 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73   works in millis
17810 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20  econds, but the 
17820 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65  underlying OsSle
17830 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75  ep() .  ** API u
17840 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  ses microseconds
17850 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30  . Hence the 1000
17860 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  's..  */.  rc = 
17870 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28  (sqlite3OsSleep(
17880 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31  pVfs, 1000*ms)/1
17890 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  000);.  return r
178a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  c;.}../*.** Enab
178b0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
178c0 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c  e extended resul
178d0 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t codes..*/.int 
178e0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
178f0 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71  _result_codes(sq
17900 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
17910 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33  noff){.  sqlite3
17920 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
17930 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
17940 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
17950 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
17960 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
17970 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
17980 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
17990 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
179a0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
179b0 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
179c0 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
179d0 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
179e0 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
179f0 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
17a00 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
17a10 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
17a20 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
17a30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17a40 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
17a50 2a 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69  *pBtree;..  sqli
17a60 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17a70 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42  db->mutex);.  pB
17a80 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  tree = sqlite3Db
17a90 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
17aa0 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
17ab0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61  pBtree ){.    Pa
17ac0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
17ad0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
17ae0 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  d;.    sqlite3Bt
17af0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
17b00 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
17b10 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
17b20 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73  (pBtree);.    as
17b30 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
17b40 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69  );.    fd = sqli
17b50 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
17b60 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
17b70 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( fd!=0 );.    i
17b80 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
17b90 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
17ba0 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
17bb0 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
17bc0 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  = fd;.      rc =
17bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17be0 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d  }else if( fd->pM
17bf0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
17c00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
17c10 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70  leControl(fd, op
17c20 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c  , pArg);.    }el
17c30 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
17c40 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
17c50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17c60 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
17c70 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ee);.  }.  sqlit
17c80 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
17c90 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
17ca0 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a  urn rc;   .}../*
17cb0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
17cc0 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67   the testing log
17cd0 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ic..*/.int sqlit
17ce0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
17cf0 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
17d00 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e  int rc = 0;.#ifn
17d10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17d20 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76  BUILTIN_TEST.  v
17d30 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
17d40 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
17d50 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
17d60 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61      /*.    ** Sa
17d70 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ve the current s
17d80 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
17d90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17da0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
17db0 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20  L_PRNG_SAVE: {. 
17dc0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
17dd0 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20  SaveState();.   
17de0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17df0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
17e00 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65  estore the state
17e10 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20   of the PRNG to 
17e20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73  the last state s
17e30 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  aved using.    *
17e40 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66  * PRNG_SAVE.  If
17e50 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e   PRNG_SAVE has n
17e60 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
17e70 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20   called, then.  
17e80 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61    ** this verb a
17e90 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45  cts like PRNG_RE
17ea0 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  SET..    */.    
17eb0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
17ec0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
17ed0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
17ee0 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61  e3PrngRestoreSta
17ef0 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
17f00 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
17f10 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68  .    ** Reset th
17f20 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69  e PRNG back to i
17f30 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ts uninitialized
17f40 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78   state.  The nex
17f50 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
17f60 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
17f70 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65  ess() will resee
17f80 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67  d the PRNG using
17f90 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20   a single call. 
17fa0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61     ** to the xRa
17fb0 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20  ndomness method 
17fc0 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  of the default V
17fd0 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  FS..    */.    c
17fe0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
17ff0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20  TRL_PRNG_RESET: 
18000 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
18010 72 6e 67 52 65 73 65 74 53 74 61 74 65 28 29 3b  rngResetState();
18020 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18030 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
18040 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
18050 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f  _control(BITVEC_
18060 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67  TEST, size, prog
18070 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ram).    **.    
18080 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67  ** Run a test ag
18090 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f  ainst a Bitvec o
180a0 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20  bject of size.  
180b0 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75  The program argu
180c0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61  ment.    ** is a
180d0 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
180e0 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73  ers that defines
180f0 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75   the test.  Retu
18100 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a  rn -1 on a.    *
18110 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
18120 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20  ion error, 0 on 
18130 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d  success, or non-
18140 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f  zero for an erro
18150 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68  r..    ** See th
18160 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  e sqlite3BitvecB
18170 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72  uiltinTest() for
18180 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
18190 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
181a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
181b0 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f  TESTCTRL_BITVEC_
181c0 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEST: {.      in
181d0 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
181e0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
181f0 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72  t *aProg = va_ar
18200 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
18210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
18220 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
18230 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20  (sz, aProg);.   
18240 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18250 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
18260 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
18270 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c  trol(BENIGN_MALL
18280 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e  OC_HOOKS, xBegin
18290 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20  , xEnd).    **. 
182a0 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68     ** Register h
182b0 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20  ooks to call to 
182c0 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d  indicate which m
182d0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73  alloc() failures
182e0 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e   .    ** are ben
182f0 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ign..    */.    
18300 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18310 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c  CTRL_BENIGN_MALL
18320 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20  OC_HOOKS: {.    
18330 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
18340 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28  *void_function)(
18350 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69  void);.      voi
18360 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
18370 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76  gnBegin;.      v
18380 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
18390 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78  nignEnd;.      x
183a0 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61  BenignBegin = va
183b0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
183c0 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78  nction);.      x
183d0 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61  BenignEnd = va_a
183e0 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
183f0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  tion);.      sql
18400 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  ite3BenignMalloc
18410 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67  Hooks(xBenignBeg
18420 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b  in, xBenignEnd);
18430 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18440 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
18450 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
18460 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
18470 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
18480 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20  _BYTE, unsigned 
18490 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
184a0 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e    ** Set the PEN
184b0 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65  DING byte to the
184c0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72   value in the ar
184d0 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a  gument, if X>0..
184e0 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63      ** Make no c
184f0 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20  hanges if X==0. 
18500 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
18510 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  e of the pending
18520 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20   byte.    ** as 
18530 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f  it existing befo
18540 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
18550 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
18560 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54  **.    ** IMPORT
18570 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74  ANT:  Changing t
18580 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
18590 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20  from 0x40000000 
185a0 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a  results in.    *
185b0 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  * an incompatibl
185c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
185d0 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e  format.  Changin
185e0 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
185f0 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  te.    ** while 
18600 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e  any database con
18610 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  nection is open 
18620 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66  results in undef
18630 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ined and.    ** 
18640 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61  dileterious beha
18650 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vior..    */.   
18660 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18670 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
18680 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  TE: {.      rc =
18690 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23   PENDING_BYTE;.#
186a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
186b0 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20  IT_WSD.      {. 
186c0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
186d0 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f  int newVal = va_
186e0 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
186f0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69   int);.        i
18700 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69  f( newVal ) sqli
18710 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d  te3PendingByte =
18720 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d   newVal;.      }
18730 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
18740 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
18750 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
18760 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
18770 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
18780 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20  ASSERT, int X). 
18790 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
187a0 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
187b0 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
187c0 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
187d0 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61   or not.    ** a
187e0 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62  ssert() was enab
187f0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
18800 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  ime.  If X is tr
18810 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a  ue and assert().
18820 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65      ** is enable
18830 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
18840 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65  rn value is true
18850 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
18860 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  and.    ** asser
18870 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
18880 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
18890 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20   value is zero. 
188a0 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20   If X is.    ** 
188b0 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
188c0 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  () is enabled, t
188d0 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f  hen the assertio
188e0 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a  n fires and the.
188f0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
18900 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20  borts.  If X is 
18910 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
18920 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
18930 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
18940 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
18950 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
18960 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18970 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a  TCTRL_ASSERT: {.
18980 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69        volatile i
18990 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
189a0 61 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f  assert( (x = va_
189b0 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20  arg(ap,int))!=0 
189c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b  );.      rc = x;
189d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
189e0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
189f0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
18a00 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
18a10 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
18a20 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
18a30 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
18a40 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
18a50 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
18a60 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59  ee how the ALWAY
18a70 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56  S and.    ** NEV
18a80 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64  ER macros were d
18a90 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  efined at compil
18aa0 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20  e-time..    **. 
18ab0 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e     ** The return
18ac0 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53   value is ALWAYS
18ad0 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  (X).  .    **.  
18ae0 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65    ** The recomme
18af0 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d  nded test is X==
18b00 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  2.  If the retur
18b10 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68  n value is 2, th
18b20 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  at means.    ** 
18b30 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
18b40 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f  ER() are both no
18b50 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
18b60 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69   macros, which i
18b70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  s the.    ** def
18b80 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49  ault setting.  I
18b90 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
18ba0 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c  ue is 1, then AL
18bb0 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72  WAYS() is either
18bc0 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64  .    ** hard-cod
18bd0 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c  ed to true or el
18be0 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66  se it asserts if
18bf0 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73   its argument is
18c00 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54   false..    ** T
18c10 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f  he first behavio
18c20 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  r (hard-coded to
18c30 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61   true) is the ca
18c40 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
18c50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
18c60 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
18c70 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
18c80 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f  led and the seco
18c90 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69  nd.    ** behavi
18ca0 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68  or (assert if th
18cb0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c  e argument to AL
18cc0 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29  WAYS() is false)
18cd0 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
18ce0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
18cf0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
18d00 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
18d10 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  ) is enabled..  
18d20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
18d30 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72  run-time test pr
18d40 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f  ocedure might lo
18d50 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ok something lik
18d60 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
18d70 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c     **    if( sql
18d80 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
18d90 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
18da0 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20  L_ALWAYS, 2)==2 
18db0 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
18dc0 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  / ALWAYS() and N
18dd0 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70  EVER() are no-op
18de0 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
18df0 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d  cros.    **    }
18e00 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
18e10 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
18e20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
18e30 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20  SERT, 1) ){.    
18e40 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
18e50 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61  S(x) asserts tha
18e60 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56  t x is true. NEV
18e70 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20  ER(x) asserts x 
18e80 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
18e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a      }else{.    *
18ea0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
18eb0 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
18ec0 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69  t 1.  NEVER(x) i
18ed0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a  s a constant 0..
18ee0 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20      **    }.    
18ef0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
18f00 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
18f10 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  YS: {.      int 
18f20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
18f30 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41  t);.      rc = A
18f40 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20  LWAYS(x);.      
18f50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
18f60 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
18f70 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
18f80 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
18f90 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  RVE, sqlite3 *db
18fa0 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
18fb0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e      ** Set the n
18fc0 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20  Reserve size to 
18fd0 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  N for the main d
18fe0 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64  atabase on the d
18ff0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63  atabase.    ** c
19000 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20  onnection db..  
19010 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
19020 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
19030 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  SERVE: {.      s
19040 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
19050 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
19060 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
19070 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
19080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
19090 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
190a0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
190b0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
190c0 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
190d0 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20  pBt, 0, x, 0);. 
190e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
190f0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
19100 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
19110 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19120 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19130 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
19140 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
19150 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ONS, sqlite3 *db
19160 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
19170 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72      ** Enable or
19180 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73   disable various
19190 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66   optimizations f
191a0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
191b0 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a  ses.  The .    *
191c0 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20  * argument N is 
191d0 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
191e0 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65  imizations to be
191f0 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20   disabled.  For 
19200 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70  normal.    ** op
19210 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64  eration N should
19220 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61   be 0.  The idea
19230 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20   is that a test 
19240 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68  program (like th
19250 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67  e.    ** SQL Log
19260 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74  ic Test or SLT t
19270 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20  est module) can 
19280 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c  run the same SQL
19290 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a   multiple times.
192a0 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69      ** with vari
192b0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
192c0 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65  s disabled to ve
192d0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61  rify that the sa
192e0 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a  me answer.    **
192f0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20   is obtained in 
19300 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20  every case..    
19310 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
19320 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
19330 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  MIZATIONS: {.   
19340 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
19350 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
19360 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
19370 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75  >dbOptFlags = (u
19380 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69  16)(va_arg(ap, i
19390 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20  nt) & 0xffff);. 
193a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
193b0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
193c0 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f  _N_KEYWORD.    /
193d0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
193e0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
193f0 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
19400 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
19410 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ord).    **.    
19420 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61  ** If zWord is a
19430 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69   keyword recogni
19440 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  zed by the parse
19450 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  r, then return t
19460 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
19470 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f   of keywords.  O
19480 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f  r if zWord is no
19490 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74  t a keyword, ret
194a0 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20  urn 0..    ** . 
194b0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
194c0 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20  feature is only 
194d0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
194e0 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69   amalgamation si
194f0 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  nce.    ** the S
19500 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
19510 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66  macro is not def
19520 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
19530 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20  e if SQLite.    
19540 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e  ** is built usin
19550 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63  g separate sourc
19560 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
19570 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19580 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
19590 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RD: {.      cons
195a0 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  t char *zWord = 
195b0 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
195c0 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69   char*);.      i
195d0 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
195e0 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20  rlen30(zWord);. 
195f0 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74       rc = (sqlit
19600 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75  e3KeywordCode((u
19610 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b  8*)zWord, n)!=TK
19620 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f  _ID) ? SQLITE_N_
19630 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20  KEYWORD : 0;.   
19640 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19650 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20  #endif ..    /* 
19660 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19670 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
19680 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
19690 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70  OC, sz, &pNew, p
196a0 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  Free);.    **.  
196b0 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20    ** Pass pFree 
196c0 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61  into sqlite3Scra
196d0 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20  tchFree(). .    
196e0 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20  ** If sz>0 then 
196f0 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74  allocate a scrat
19700 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70  ch buffer into p
19710 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  New.  .    */.  
19720 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19730 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
19740 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f  LLOC: {.      vo
19750 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e  id *pFree, **ppN
19760 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  ew;.      int sz
19770 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f  ;.      sz = va_
19780 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
19790 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61      ppNew = va_a
197a0 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a  rg(ap, void**);.
197b0 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61        pFree = va
197c0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
197d0 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20  .      if( sz ) 
197e0 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  *ppNew = sqlite3
197f0 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a  ScratchMalloc(sz
19800 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19810 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65  ScratchFree(pFre
19820 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
19830 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
19840 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19850 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
19860 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
19870 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66  FAULT, int onoff
19880 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
19890 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
198a0 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
198b0 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   configure the w
198c0 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20  rappers so that 
198d0 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  all.    ** subse
198e0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
198f0 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76  ocaltime() and v
19900 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66  ariants fail. If
19910 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a   onoff is zero,.
19920 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73      ** undo this
19930 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
19940 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19950 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
19960 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
19970 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
19980 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d  Config.bLocaltim
19990 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28  eFault = va_arg(
199a0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
199b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
199c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
199d0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
199e0 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73  LAIN).    /*   s
199f0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19a00 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19a10 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54  TRL_EXPLAIN_STMT
19a20 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ,.    **        
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f  sqlite3_stmt*,co
19a50 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20  nst char**);.   
19a60 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f   **.    ** If co
19a70 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
19a80 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
19a90 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71 6c  XPLAIN, each sql
19aa0 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a  ite3_stmt holds.
19ab0 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20      ** a string 
19ac0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
19ad0 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61 72  he optimized par
19ae0 73 65 20 74 72 65 65 2e 20 20 54 68 69 73 20 74  se tree.  This t
19af0 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20  est-control.    
19b00 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
19b10 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72  nter to that str
19b20 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
19b30 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
19b40 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d  CTRL_EXPLAIN_STM
19b50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
19b60 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
19b70 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
19b80 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20  te3_stmt*);.    
19b90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
19ba0 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61 70  zRet = va_arg(ap
19bb0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b  , const char**);
19bc0 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d 20  .      *pzRet = 
19bd0 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
19be0 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70 53  nation((Vdbe*)pS
19bf0 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tmt);.      brea
19c00 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
19c10 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
19c20 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
19c30 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
19c40 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
19c50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
19c60 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
19c70 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
19c80 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
19c90 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
19ca0 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
19cb0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
19cc0 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
19cd0 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
19ce0 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
19cf0 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
19d00 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
19d10 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
19d20 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
19d30 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
19d40 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
19d50 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
19d60 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
19d70 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
19d80 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
19d90 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
19da0 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
19db0 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
19dc0 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
19dd0 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
19de0 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
19df0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
19e00 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
19e10 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
19e20 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
19e30 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
19e40 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
19e50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
19e60 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
19e70 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
19e80 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
19e90 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
19ea0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
19eb0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
19ec0 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
19ed0 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  lename==0 ) retu
19ee0 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  rn 0;.  zFilenam
19ef0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
19f00 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
19f10 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46  + 1;.  while( zF
19f20 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
19f30 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70    int x = strcmp
19f40 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
19f50 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  am);.    zFilena
19f60 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
19f70 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
19f80 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d   + 1;.    if( x=
19f90 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c  =0 ) return zFil
19fa0 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65  ename;.    zFile
19fb0 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
19fc0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
19fd0 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65  e) + 1;.  }.  re
19fe0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
19ff0 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61   Return a boolea
1a000 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  n value for a qu
1a010 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1a020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72  /.int sqlite3_ur
1a030 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  i_boolean(const 
1a040 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1a050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1a060 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b  ram, int bDflt){
1a070 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a080 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1a090 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1a0a0 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62  me, zParam);.  b
1a0b0 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b  Dflt = bDflt!=0;
1a0c0 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71  .  return z ? sq
1a0d0 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
1a0e0 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c  z, bDflt) : bDfl
1a0f0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
1a100 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  rn a 64-bit inte
1a110 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ger value for a 
1a120 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1a130 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1a140 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  4 sqlite3_uri_in
1a150 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  t64(.  const cha
1a160 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1a170 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20   /* Filename as 
1a180 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20  passed to xOpen 
1a190 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1a1a0 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f  *zParam,       /
1a1b0 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20  * URI parameter 
1a1c0 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69  sought */.  sqli
1a1d0 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20  te3_int64 bDflt 
1a1e0 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
1a1f0 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  if parameter is 
1a200 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  missing */.){.  
1a210 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1a220 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1a230 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1a240 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69   zParam);.  sqli
1a250 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69  te3_int64 v;.  i
1a260 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 41  f( z && sqlite3A
1a270 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20 73 71 6c  toi64(z, &v, sql
1a280 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
1a290 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3d 3d 53   SQLITE_UTF8)==S
1a2a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a2b0 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1a2c0 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1a2d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1a2e0 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1a2f0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1a300 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1a310 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1a320 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1a330 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1a340 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1a350 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1a360 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1a370 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1a380 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1a390 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1a3a0 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
1a3b0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
1a3c0 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
1a3d0 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
1a3e0 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1a3f0 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44     return db->aD
1a400 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a  b[i].pBt;.    }.
1a410 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a420 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a430 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
1a440 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1a450 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
1a460 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1a470 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
1a480 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
1a490 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
1a4a0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1a4b0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1a4c0 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69  tree *pBt = sqli
1a4d0 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1a4e0 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1a4f0 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1a500 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
1a510 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
1a520 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a530 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
1a540 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
1a550 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
1a560 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
1a570 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
1a580 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
1a590 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1a5a0 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
1a5b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a5c0 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1a5d0 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1a5e0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1a5f0 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1a600 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 50  n pBt ? sqlite3P
1a610 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 73  agerIsreadonly(s
1a620 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1a630 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a 7d 0a     (pBt)) : -1;.}.