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

Artifact 5307601c58b6e08153a15846098399a59c166d8d:


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 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1110: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
1120: 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  nt bRunExtraInit
1130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1150: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
1160: 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ion needed */.#e
1170: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1180: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
11a0: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
11b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d0: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
11e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
11f0: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
1200: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
1210: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
1220: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
1230: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1240: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
1250: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
1260: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1270: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
1280: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
1290: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
12a0: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
12b0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
12c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
12f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1310: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 7b  NABLE_SQLLOG.  {
1320: 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1330: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
1340: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
1350: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
1360: 6c 6f 67 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  log();.  }.#endi
1370: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
1380: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1390: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
13a0: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
13b0: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
13c0: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
13d0: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
13e0: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
13f0: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
1400: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
1410: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
1420: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
1430: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
1440: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
1450: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
1460: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
1470: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
1480: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
1490: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
14a0: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
14b0: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
14c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
14d0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
14e0: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
14f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1500: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
1510: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
1520: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
1530: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
1540: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
1550: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1560: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1570: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
1580: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
1590: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
15a0: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
15b0: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
15c0: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
15d0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
15e0: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
15f0: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
1600: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
1610: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
1620: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
1630: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
1640: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
1650: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1660: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
1670: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
1680: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1690: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
16b0: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
16c0: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
16d0: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
16e0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
16f0: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
1700: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1710: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1730: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
1740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1750: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1760: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1770: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1780: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1790: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
17b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
17c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
17d0: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
17e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
17f0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1800: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
1810: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1820: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
1830: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
1840: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1850: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1860: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1870: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
18b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
18c0: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
18d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18e0: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
18f0: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1900: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1910: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1920: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1930: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1940: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1950: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1960: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1970: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1980: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1990: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
19a0: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
19b0: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
19c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19e0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
19f0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1a00: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1a10: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1a20: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1a30: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1a40: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1a50: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1a60: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1a70: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1a80: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a90: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1aa0: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1ab0: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1ac0: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1ad0: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1ae0: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1af0: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1b00: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1b10: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1b20: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1b30: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1b40: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1b50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1b60: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1b70: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1b80: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1b90: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1ba0: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1bb0: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1bc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1bd0: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1be0: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1bf0: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1c00: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1c10: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1c20: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1c30: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1c40: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1c50: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1c60: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1c70: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1c80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c90: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1ca0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1cb0: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1cc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1cd0: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1ce0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cf0: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1d00: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1d10: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1d20: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1d30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1d40: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1d50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d60: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1d70: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1d80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1d90: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1da0: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
1db0: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
1dc0: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
1dd0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1de0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1df0: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
1e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1e10: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
1e20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1e50: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1e60: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
1e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e80: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
1e90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ea0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1eb0: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1ec0: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1ed0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1ee0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1ef0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f00: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
1f10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1f20: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
1f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f40: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
1f50: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1f60: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
1f70: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
1f80: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1f90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fa0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1fb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1fc0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fe0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1ff0: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
2000: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
2010: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
2020: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
2030: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
2040: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
2050: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2060: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2070: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2080: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2090: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
20a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
20b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
20c0: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
20d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
20f0: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
2100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
2110: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
2120: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2130: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
2140: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2150: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2160: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2170: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2180: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2190: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
21a0: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
21b0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
21c0: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
21d0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
21e0: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
21f0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
2200: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
2210: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
2220: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
2230: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
2240: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
2250: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2260: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2270: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2280: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2290: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
22a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
22c0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
22d0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
22e0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
22f0: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
2300: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
2310: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2320: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2330: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2340: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2350: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2360: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2370: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2380: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2390: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
23a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
23b0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
23c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
23d0: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
23e0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23f0: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2400: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2410: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2420: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2430: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2440: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2450: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2460: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2470: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2480: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24a0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
24b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
24c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24d0: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
24e0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
24f0: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2500: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2510: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2520: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2530: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2540: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2550: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2560: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2570: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2580: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2590: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
25a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
25b0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
25c0: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
25d0: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
25e0: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
25f0: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2600: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2610: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2620: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2630: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2640: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2650: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2660: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2670: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2680: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2690: 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  id){.  if( sqlit
26a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
26b0: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
26c0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
26d0: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
26e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
26f0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2700: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2710: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2720: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2730: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2740: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2750: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2760: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2770: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2780: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2790: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
27a0: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
27b0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
27c0: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
27d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27e0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
27f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2800: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2810: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2820: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2830: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2840: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2850: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2860: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2870: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2880: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2890: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
28a0: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
28b0: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
28c0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
28d0: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
28e0: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
28f0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2900: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2910: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2920: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2930: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2940: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2950: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2960: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2970: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2980: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2990: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
29a0: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
29b0: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
29c0: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
29d0: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
29e0: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
29f0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2a00: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2a10: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2a20: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2a30: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2a40: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2a50: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2a60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2a70: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2a80: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2a90: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2aa0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2ab0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2ac0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2ad0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2ae0: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2af0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2b00: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2b10: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2b20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2b40: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2b50: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2b60: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2b70: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2b80: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2b90: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2ba0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bb0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2bc0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2bd0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2be0: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2bf0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2c00: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c10: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2c20: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2c30: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2c40: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2c50: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2c60: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2c70: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2c80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2c90: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2ca0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2cb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cc0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2cd0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2ce0: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2cf0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2d00: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2d10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2d20: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2d30: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2d40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d50: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2d60: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2d70: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
2d80: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
2d90: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
2da0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
2db0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
2dc0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
2dd0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2de0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2df0: 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66   .    */.#if def
2e00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
2e10: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
2e20: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20  E_THREADSAFE>0. 
2e30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2e40: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
2e50: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e60: 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  isable all mutex
2e70: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2e80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2e90: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b  .bCoreMutex = 0;
2ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2eb0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ec0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
2ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ee0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2ef0: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
2f00: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2f10: 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66  able mutexing of
2f20: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2f30: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f  tions */.      /
2f40: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e  * Enable mutexin
2f50: 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73  g of core data s
2f60: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
2f70: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2f80: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2f90: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2fa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fb0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
2fc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2fd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2fe0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41  ITE_CONFIG_SERIA
2ff0: 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f  LIZED: {.      /
3000: 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74  * Enable all mut
3010: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
3020: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3030: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3040: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
3050: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3060: 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  llMutex = 1;.   
3070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3090: 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a  CONFIG_MUTEX: {.
30a0: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79        /* Specify
30b0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
30c0: 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61  mutex implementa
30d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
30e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
30f0: 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72  g.mutex = *va_ar
3100: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
3110: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  tex_methods*);. 
3120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3130: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3140: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
3150: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
3160: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
3170: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
3180: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3190: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
31a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
31b0: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
31c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
31d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20     }.#endif...  
31f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3200: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
3210: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3220: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
3230: 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61  alloc implementa
3240: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3250: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3260: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
3270: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3280: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
3290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
32b0: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
32c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
32d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  e the current ma
32e0: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
32f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
3300: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3310: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
3320: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
3330: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
3340: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
3350: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3360: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3370: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
3380: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3390: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
33a0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
33b0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  US: {.      /* E
33c0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
33d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74   the malloc stat
33e0: 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f  us collection */
33f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3400: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
3410: 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tat = va_arg(ap,
3420: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3430: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3440: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3450: 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20  _SCRATCH: {.    
3460: 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61    /* Designate a
3470: 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72 61   buffer for scra
3480: 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  tch memory space
3490: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
34b0: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
34c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
34d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
34e0: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
34f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3500: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3510: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3520: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3530: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3550: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3560: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3570: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
3580: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
3590: 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72  page cache memor
35a0: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
35b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
35c0: 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f  nfig.pPage = va_
35d0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
35e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
35f0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
3600: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3610: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3620: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
3630: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3640: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3650: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3660: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3670: 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  G_PCACHE: {.    
3680: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
3690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
36a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
36b0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
36c0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
36d0: 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  w an error */.  
36e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36f0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3700: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3710: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3720: 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  G_PCACHE2: {.   
3730: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
3740: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
3750: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
3760: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3770: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3780: 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76  fig.pcache2 = *v
3790: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37a0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
37b0: 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  2*);.      break
37c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
37d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
37e0: 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  ETPCACHE2: {.   
37f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3800: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3810: 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  e2.xInit==0 ){. 
3820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43         sqlite3PC
3830: 61 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29  acheSetDefault()
3840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3850: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3860: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
3870: 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ds2*) = sqlite3G
3880: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
3890: 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  he2;.      break
38a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
38b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
38c0: 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64  LE_MEMSYS3) || d
38d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
38e0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20  ABLE_MEMSYS5).  
38f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3900: 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20  NFIG_HEAP: {.   
3910: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
3920: 61 20 62 75 66 66 65 72 20 66 6f 72 20 68 65 61  a buffer for hea
3930: 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  p memory space *
3940: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3950: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
3960: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  p = va_arg(ap, v
3970: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3980: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3990: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
39a0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
39b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39c0: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61  fig.mnReq = va_a
39d0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20  rg(ap, int);..  
39e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
39f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3a00: 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  q<1 ){.        s
3a10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3a20: 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20  ig.mnReq = 1;.  
3a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
3a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3a50: 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20  g.mnReq>(1<<12) 
3a60: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61  ){.        /* ca
3a70: 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69  p min request si
3a80: 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20  ze at 2^12 */.  
3a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3aa0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
3ab0: 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20  = (1<<12);.     
3ac0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
3ad0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3ae0: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
3af0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
3b00: 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20  heap pointer is 
3b10: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f  NULL, then resto
3b20: 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d  re the malloc im
3b30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20  plementation.   
3b40: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
3b50: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f  NULL pointers to
3b60: 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  o.  This will ca
3b70: 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74  use the malloc t
3b80: 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  o go.        ** 
3b90: 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61  back to its defa
3ba0: 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ult implementati
3bb0: 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f  on when sqlite3_
3bc0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a  initialize() is.
3bd0: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a          ** run..
3be0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
3bf0: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
3c00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3c10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
3c20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c30: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
3c40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
3c50: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
3c60: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3c70: 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74  install one of t
3c80: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  he.        ** me
3c90: 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68  m5.c/mem3.c meth
3ca0: 6f 64 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73  ods.  The enclos
3cb0: 69 6e 67 20 23 69 66 20 67 75 61 72 61 6e 74 65  ing #if guarante
3cc0: 65 73 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a  es at.        **
3cd0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
3ce0: 65 73 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63  ese methods is c
3cf0: 75 72 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64  urrently enabled
3d00: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
3d10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3d20: 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20  E_MEMSYS3.      
3d30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3d40: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
3d50: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28  e3MemGetMemsys3(
3d60: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
3d70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
3d80: 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73  EMSYS5.        s
3d90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3da0: 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d  ig.m = *sqlite3M
3db0: 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a  emGetMemsys5();.
3dc0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
3dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3de0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61  }.#endif..    ca
3df0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3e00: 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20  _LOOKASIDE: {.  
3e10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3e20: 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
3e30: 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ide = va_arg(ap,
3e40: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3e50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3e60: 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61  .nLookaside = va
3e70: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3e80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3e90: 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65  }.    .    /* Re
3ea0: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
3eb0: 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e  o the logger fun
3ec0: 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69  ction and its fi
3ed0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
3ee0: 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
3ef0: 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69   is NULL.  Loggi
3f00: 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ng is disabled i
3f10: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  f the function p
3f20: 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a  ointer is.    **
3f30: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
3f40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3f50: 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20  NFIG_LOG: {.    
3f60: 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
3f70: 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
3f80: 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
3f90: 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
3fa0: 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
3fb0: 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
3fc0: 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
3fd0: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
3fe0: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
3ff0: 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28  arg(ap, void(*)(
4000: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
4010: 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a  char*));.      *
4020: 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
4030: 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29  void(*LOGFUNC_t)
4040: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
4050: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73   char*);.      s
4060: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4070: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
4080: 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b  (ap, LOGFUNC_t);
4090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
40a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41  obalConfig.pLogA
40b0: 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  rg = va_arg(ap, 
40c0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72  void*);.      br
40d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
40e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40f0: 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20  IG_URI: {.      
4100: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4110: 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76  fig.bOpenUri = v
4120: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4140: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4150: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
4160: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20  ING_INDEX_SCAN: 
4170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
4180: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
4190: 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Cis = va_arg(ap,
41a0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
41b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
41c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
41d0: 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20  SQLLOG.    case 
41e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
41f0: 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79  LLOG: {.      ty
4200: 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c  pedef void(*SQLL
4210: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
4220: 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
4230: 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20   char*, int);.  
4240: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4250: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
4260: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c  = va_arg(ap, SQL
4270: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
4280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4290: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
42a0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
42b0: 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  id *);.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
42d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
42e0: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
42f0: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ZE: {.      sqli
4300: 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
4310: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
4320: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
4330: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
4340: 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 mxMmap = va_ar
4350: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
4360: 74 36 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t64);.      if( 
4370: 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d  mxMmap<0 || mxMm
4380: 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  ap>SQLITE_MAX_MM
4390: 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  AP_SIZE ){.     
43a0: 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49     mxMmap = SQLI
43b0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
43c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
43d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
43e0: 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d  fig.mxMmap = mxM
43f0: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73  map;.      if( s
4400: 7a 4d 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70  zMmap<0 ) szMmap
4410: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
4420: 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20  T_MMAP_SIZE;.   
4430: 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78     if( szMmap>mx
4440: 4d 6d 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d  Mmap) szMmap = m
4450: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
4460: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4470: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
4480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4490: 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
44a0: 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e  _OS_WIN && defin
44b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
44c0: 4d 41 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65  MALLOC).    case
44d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57   SQLITE_CONFIG_W
44e0: 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b  IN32_HEAPSIZE: {
44f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4500: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70  obalConfig.nHeap
4510: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4520: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
4530: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4540: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4550: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4560: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4570: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4580: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
4590: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
45a0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
45b0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
45c0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
45d0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
45e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
45f0: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
4600: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
4610: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
4620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4630: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
4640: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
4650: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4660: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
4670: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
4680: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
4690: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
46a0: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
46b0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
46c0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
46d0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
46e0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
46f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4700: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
4710: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4720: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
4730: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
4740: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
4750: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4770: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
4780: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4790: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
47a0: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
47b0: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
47c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
47d0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
47e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
47f0: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
4800: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
4810: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
4820: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
4830: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
4840: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
4850: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
4860: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
4870: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
4880: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
4890: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
48a0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
48b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
48c0: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
48d0: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
48e0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
48f0: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
4900: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
4910: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
4920: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
4930: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
4940: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
4950: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
4960: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
4970: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
4980: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
4990: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
49a0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
49b0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
49c0: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
49d0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
49e0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
49f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
4a00: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
4a10: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4a20: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4a30: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
4a40: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
4a50: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
4a60: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
4a70: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
4a80: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
4a90: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
4aa0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
4ab0: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
4ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
4ad0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
4ae0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4af0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
4b00: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4b10: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4b20: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4b30: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4b40: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4b50: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4b60: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4b70: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4b80: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4b90: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
4ba0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
4bb0: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
4bc0: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
4bd0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
4be0: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
4bf0: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
4c00: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4c10: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4c20: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4c30: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4c40: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4c50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4c60: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4c70: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4c80: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4c90: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
4ca0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
4cb0: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
4cc0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4cd0: 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20  Start = db;.    
4ce0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4cf0: 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  nd = db;.    db-
4d00: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
4d10: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
4d20: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4d30: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4d60: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4d70: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4d80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4d90: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4da0: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4db0: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
4dc0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
4dd0: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
4de0: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
4df0: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
4e00: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
4e10: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
4e20: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
4e30: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
4e40: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
4e50: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4e60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4e70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4e80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4e90: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4ea0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4eb0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
4ec0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
4ed0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
4ee0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
4ef0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
4f00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
4f10: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
4f20: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
4f30: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4f40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
4f50: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
4f60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4f70: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4f80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4f90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4fa0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4fb0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4fc0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4fd0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4fe0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4ff0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
5000: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
5010: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
5020: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
5030: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
5040: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
5050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
5060: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
5070: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
5080: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
5090: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
50a0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
50b0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
50c0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
50d0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
50e0: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
50f0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
5100: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5110: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
5120: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
5130: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
5140: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
5150: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
5160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5170: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5180: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
5190: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
51a0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
51b0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
51c0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
51d0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
51e0: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
51f0: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
5200: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
5210: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
5220: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
5230: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
5240: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
5250: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
5260: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
5270: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
5280: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
5290: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
52a0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
52b0: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
52c0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
52d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
52e0: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
52f0: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
5300: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5310: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
5320: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
5330: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
5340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
5350: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
5360: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
5370: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
5380: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
5390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
53a0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
53b0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
53c0: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
53e0: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
53f0: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
5400: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
5410: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
5420: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
5430: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
5440: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
5450: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
5460: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
5470: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
5480: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
5490: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
54a0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
54b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
54c0: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
54d0: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
54e0: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
54f0: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
5500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5510: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5520: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
5530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5550: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5560: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5570: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5580: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5590: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
55a0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
55b0: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
55c0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
55d0: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
55e0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
55f0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
5600: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
5610: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
5620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5630: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
5640: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
5650: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
5660: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
5670: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
5680: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
5690: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
56a0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
56b0: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
56c0: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
56d0: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
56e0: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
56f0: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
5700: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5710: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
5720: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
5730: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
5740: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
5750: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
5760: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5770: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
5780: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
5790: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
57a0: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
57b0: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
57c0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
57d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
57e0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
57f0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
5800: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
5810: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
5820: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
5830: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
5840: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
5850: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
5860: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
5870: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
5880: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
5890: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
58a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
58b0: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
58c0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
58d0: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
58e0: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
58f0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
5900: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
5910: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
5920: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
5930: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
5940: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
5950: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
5960: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
5970: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
5980: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
5990: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
59a0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
59b0: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
59c0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
59d0: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
59e0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
59f0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
5a00: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
5a10: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5a20: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
5a30: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
5a40: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
5a50: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
5a60: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
5a70: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
5a80: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
5a90: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
5aa0: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
5ab0: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
5ac0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
5ad0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
5ae0: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
5af0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
5b00: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
5b10: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
5b20: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
5b30: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
5b40: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
5b50: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
5b60: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
5b70: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
5b80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5b90: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
5ba0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5bb0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
5bc0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
5bd0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
5be0: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
5bf0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
5c00: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
5c10: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
5c20: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5c30: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5c40: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
5c50: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5c60: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5c70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5c80: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5c90: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5ca0: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5cb0: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
5cc0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
5cd0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
5ce0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
5cf0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
5d00: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
5d10: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
5d20: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
5d30: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
5d40: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
5d50: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5d60: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5d70: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5d80: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5d90: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5da0: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5db0: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
5dc0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
5dd0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
5de0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
5df0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
5e00: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
5e10: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
5e20: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
5e30: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
5e40: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
5e50: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5e60: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5e70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5e80: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5e90: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5ea0: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5eb0: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
5ec0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
5ed0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
5ee0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
5ef0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
5f00: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
5f10: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
5f20: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
5f30: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
5f40: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
5f50: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5f60: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5f70: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5f80: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5f90: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5fa0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5fb0: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5fc0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5fd0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5fe0: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5ff0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
6000: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
6010: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
6020: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
6030: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
6040: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
6050: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
6060: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
6070: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
6080: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
6090: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
60a0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65  ../*.** Disconne
60b0: 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76  ct all sqlite3_v
60c0: 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74  tab objects that
60d0: 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62   belong to datab
60e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
60f0: 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61  * db. This is ca
6100: 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20  lled when db is 
6110: 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f  being closed..*/
6120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
6130: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73  connectAllVtab(s
6140: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
6150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6160: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6170: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
6180: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
6190: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
61a0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
61b0: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
61c0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
61d0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
61e0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
61f0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73  ema ){.      Has
6200: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  hElem *p;.      
6210: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
6220: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
6230: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
6240: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
6250: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
6260: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
6270: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
6280: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
6290: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
62a0: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
62b0: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
62c0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
62d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
62e0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
62f0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
6300: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
6310: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
6320: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
6330: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6340: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
6350: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
6360: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
6370: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
6380: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6390: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
63a0: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
63b0: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
63c0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
63d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
63e0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
63f0: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
6400: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
6410: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
6420: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
6430: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6440: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
6450: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
6460: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
6470: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
6480: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6490: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
64a0: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
64b0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
64c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
64d0: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
64e0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
64f0: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
6500: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
6510: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6520: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
6530: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
6540: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
6550: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6560: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
6570: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6580: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6590: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
65a0: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
65b0: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
65c0: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
65d0: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
65e0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
65f0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
6600: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
6610: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
6620: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
6630: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
6640: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
6650: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
6660: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
6670: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
6680: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
6690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
66a0: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
66b0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
66c0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
66d0: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
66e0: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
66f0: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
6700: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
6710: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
6720: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
6730: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
6740: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
6750: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
6760: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
6770: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6780: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
6790: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
67a0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
67b0: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
67c0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
67d0: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
67e0: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
67f0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
6800: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
6810: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
6820: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
6830: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6840: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
6850: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
6860: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
6870: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
6880: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
6890: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
68a0: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
68b0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
68c0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
68d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
68e0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
68f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6900: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
6910: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
6920: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
6930: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20  .    /* Closing 
6940: 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72  the handle. Four
6950: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
6960: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
6970: 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   2. */.    sqlit
6980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
6990: 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c  Sqllog(sqlite3Gl
69a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
69b0: 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29  ogArg, db, 0, 2)
69c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
69d0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
69e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
69f0: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
6a00: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
6a10: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
6a20: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
6a30: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
6a40: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6a50: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
6a60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6a70: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
6a80: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
6a90: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
6aa0: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
6ab0: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
6ac0: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
6ad0: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
6ae0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
6af0: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
6b00: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
6b10: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
6b20: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
6b30: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6b40: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6b50: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6b60: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
6b70: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
6b80: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
6b90: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6ba0: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
6bb0: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
6bc0: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
6bd0: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
6be0: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
6bf0: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
6c00: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
6c10: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
6c20: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
6c30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6c40: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
6c50: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6c60: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
6c70: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
6c80: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
6c90: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6ca0: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
6cb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
6cc0: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
6cd0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6ce0: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
6cf0: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
6d00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6d10: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
6d20: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
6d30: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
6d40: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
6d50: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
6d60: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
6d70: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
6d80: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
6d90: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
6da0: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
6db0: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
6dc0: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
6dd0: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
6de0: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
6df0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
6e00: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6e10: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
6e20: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
6e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6e40: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
6e50: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
6e60: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
6e70: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
6e80: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
6e90: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
6ea0: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
6eb0: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
6ec0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
6ed0: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
6ee0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
6ef0: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
6f00: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
6f10: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
6f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
6f30: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
6f40: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
6f50: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
6f60: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
6f70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6f80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
6f90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
6fa0: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
6fb0: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
6fc0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
6fd0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
6fe0: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
6ff0: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
7000: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
7010: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
7020: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
7030: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  sed to sqlite3_c
7040: 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  lose (meaning th
7050: 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69  at it is a zombi
7060: 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a  e).  Therefore,.
7070: 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
7080: 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  d free all resou
7090: 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  rces..  */..  /*
70a0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
70b0: 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20  n is open, roll 
70c0: 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c  it back. This al
70d0: 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  so ensures that 
70e0: 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61  if.  ** any data
70f0: 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76  base schemas hav
7100: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
7110: 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65  by an uncommitte
7120: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d transaction.  
7130: 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65  ** they are rese
7140: 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  t. And that the 
7150: 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20  required b-tree 
7160: 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f  mutex is held to
7170: 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70   make.  ** the p
7180: 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ager rollback an
7190: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61  d schema reset a
71a0: 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69  n atomic operati
71b0: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
71c0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
71d0: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f  SQLITE_OK);..  /
71e0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
71f0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
7200: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
7210: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
7220: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
7230: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
7240: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7250: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
7260: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
7270: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
7280: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
7290: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
72a0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
72b0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
72c0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
72d0: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
72e0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
72f0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
7300: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
7310: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
7320: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
7330: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
7340: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
7350: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
7360: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
7370: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
7380: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
7390: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
73a0: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
73b0: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
73c0: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
73d0: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
73e0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
73f0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
7400: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
7410: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
7420: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
7430: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
7440: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
7450: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
7460: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
7470: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
7480: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
7490: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
74a0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
74b0: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
74c0: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
74d0: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
74e0: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
74f0: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
7500: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
7510: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
7520: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
7530: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
7540: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
7550: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
7560: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
7570: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
7580: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
7590: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
75a0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
75b0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
75c0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
75d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
75e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
75f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
7600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7610: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
7620: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7630: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
7640: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
7650: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
7660: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
7670: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
7680: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
7690: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
76a0: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
76b0: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
76c0: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
76d0: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
76e0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
76f0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
7700: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
7710: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
7720: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
7730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7740: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7750: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
7760: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
7770: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
7780: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
7790: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
77a0: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
77b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
77c0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
77d0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
77e0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
77f0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
7800: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
7810: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
7820: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
7830: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
7840: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
7850: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7860: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
7870: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
7880: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7890: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
78a0: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
78b0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
78c0: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
78d0: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
78e0: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
78f0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7900: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
7910: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
7920: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64  nsions(db);..  d
7930: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
7940: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a  E_MAGIC_ERROR;..
7950: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61    /* The temp-da
7960: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
7970: 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65   allocated diffe
7980: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
7990: 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  other schema.  *
79a0: 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67  * objects (using
79b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
79c0: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
79d0: 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  d of sqlite3Btre
79e0: 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a  eSchema())..  **
79f0: 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   So it needs to 
7a00: 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54  be freed here. T
7a10: 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c  odo: Why not rol
7a20: 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  l the temp schem
7a30: 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  a into.  ** the 
7a40: 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  same sqliteMallo
7a50: 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74  c() as the one t
7a60: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68  hat allocates th
7a70: 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a  e database .  **
7a80: 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f   structure?.  */
7a90: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7aa0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  (db, db->aDb[1].
7ab0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
7ac0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7ad0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
7ae0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7af0: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
7b00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
7b10: 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ree(db->mutex);.
7b20: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
7b30: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20  okaside.nOut==0 
7b40: 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20  );  /* Fails on 
7b50: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  a lookaside memo
7b60: 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28  ry leak */.  if(
7b70: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
7b80: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
7b90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
7ba0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
7bb0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
7bc0: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
7bd0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
7be0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
7bf0: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
7c00: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
7c10: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65   then.** any ope
7c20: 6e 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  n cursors are in
7c30: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
7c40: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
7c50: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
7c60: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
7c70: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
7c80: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
7c90: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
7ca0: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
7cb0: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
7cc0: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7cd0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
7ce0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74  lite3 *db, int t
7cf0: 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ripCode){.  int 
7d00: 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  i;.  int inTrans
7d10: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7d20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7d30: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
7d40: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
7d50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
7d60: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20    /* Obtain all 
7d70: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62  b-tree mutexes b
7d80: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79  efore making any
7d90: 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52   calls to BtreeR
7da0: 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a  ollback(). .  **
7db0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
7dc0: 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  nt in case the t
7dd0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
7de0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73   rolled back has
7df0: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
7e00: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
7e10: 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  ma. If the b-tre
7e20: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
7e30: 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72  t taken.  ** her
7e40: 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20  e, then another 
7e50: 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e  shared-cache con
7e60: 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e  nection might sn
7e70: 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20  eak in between. 
7e80: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
7e90: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
7ea0: 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63  hema reset, whic
7eb0: 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73  h can cause fals
7ec0: 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f  e.  ** corruptio
7ed0: 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d  n reports in som
7ee0: 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73  e cases.  */.  s
7ef0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7f00: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  All(db);..  for(
7f10: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7f20: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
7f30: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
7f40: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
7f50: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7f60: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7f70: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
7f80: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
7f90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7fa0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
7fb0: 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
7fc0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
7fd0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
7fe0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
7ff0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
8000: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
8010: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
8020: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
8030: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
8040: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
8050: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
8060: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
8070: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
8080: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
8090: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
80a0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
80b0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
80c0: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
80d0: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
80e0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
80f0: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
8100: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
8110: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
8120: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
8130: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
8140: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
8150: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
8160: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
8170: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
8180: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
8190: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
81a0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
81b0: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
81c0: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
81d0: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
81e0: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
81f0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
8200: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8210: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
8220: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
8230: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
8240: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
8250: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
8260: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
8270: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
8280: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
8290: 45 53 54 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  EST).const char 
82a0: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
82b0: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
82c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
82d0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
82e0: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
82f0: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
8300: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
8310: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
8320: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
8330: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
8350: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
8360: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
8370: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8380: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
8390: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
83a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
83b0: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
83c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
83d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
83e0: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
83f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8400: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
8410: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8420: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
8430: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
8440: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8450: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
8460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8470: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
8480: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
8490: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
84a0: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
84b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
84c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
84d0: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
84e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
84f0: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
8500: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
8510: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8520: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
8530: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8540: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
8550: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8560: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8570: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
8580: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8590: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
85a0: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
85b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
85c0: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
85d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
85e0: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
85f0: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
8600: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8610: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
8620: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8630: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
8640: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8650: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8660: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
8670: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
8680: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
8690: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
86a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
86b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
86c0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
86d0: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
86f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8700: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
8710: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8720: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
8730: 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  LY";          br
8740: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8750: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
8760: 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65  RECOVERY:  zName
8770: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
8780: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62  NLY_RECOVERY"; b
8790: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
87a0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
87b0: 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d  _CANTLOCK:  zNam
87c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
87d0: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
87e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
87f0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
8800: 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61  Y_ROLLBACK:  zNa
8810: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
8820: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b  DONLY_ROLLBACK";
8830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8840: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
8850: 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e  LY_DBMOVED:   zN
8860: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
8870: 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b  ADONLY_DBMOVED";
8880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8890: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
88a0: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a  RUPT:          z
88b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
88c0: 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20  NTERRUPT";      
88d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
88e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
88f0: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
8900: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8910: 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20  IOERR";         
8920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8930: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8940: 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  RR_READ:        
8950: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8960: 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20  _IOERR_READ";   
8970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8980: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8990: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
89a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
89b0: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
89c0: 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AD";  break;.   
89d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
89e0: 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20  OERR_WRITE:     
89f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8a00: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
8a10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8a20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8a30: 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20  IOERR_FSYNC:    
8a40: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8a50: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22  ITE_IOERR_FSYNC"
8a60: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8a70: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8a80: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
8a90: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
8aa0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
8ab0: 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SYNC";   break;.
8ac0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8ad0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
8ae0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
8af0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
8b00: 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b  CATE";    break;
8b10: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8b20: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20  TE_IOERR_FSTAT: 
8b30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8b40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
8b50: 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  AT";       break
8b60: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8b70: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
8b80: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
8b90: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  "SQLITE_IOERR_UN
8ba0: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
8bb0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8bc0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
8bd0: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
8be0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
8bf0: 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  DLOCK";      bre
8c00: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8c10: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
8c20: 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  TE:       zName 
8c30: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8c40: 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72  DELETE";      br
8c50: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8c60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
8c70: 43 4b 45 44 3a 20 20 20 20 20 20 7a 4e 61 6d 65  CKED:      zName
8c80: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8c90: 5f 42 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 62  _BLOCKED";     b
8ca0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8cb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
8cc0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  MEM:        zNam
8cd0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8ce0: 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  R_NOMEM";       
8cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8d00: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
8d10: 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61  CCESS:       zNa
8d20: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8d30: 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20  RR_ACCESS";     
8d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8d50: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8d60: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
8d70: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8da0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
8db0: 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65  SERVEDLOCK"; bre
8dc0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8dd0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
8de0: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
8df0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8e00: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72  LOCK";        br
8e10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8e20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
8e30: 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  SE:        zName
8e40: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8e50: 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62  _CLOSE";       b
8e60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8e70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
8e80: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d  R_CLOSE:    zNam
8e90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8ea0: 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20  R_DIR_CLOSE";   
8eb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8ec0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8ed0: 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61  HMOPEN:      zNa
8ee0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8ef0: 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20  RR_SHMOPEN";    
8f00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8f10: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8f20: 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e  SHMSIZE:      zN
8f30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8f40: 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20  ERR_SHMSIZE";   
8f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8f60: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8f70: 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a  _SHMLOCK:      z
8f80: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8f90: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20  OERR_SHMLOCK";  
8fa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8fb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8fc0: 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20  R_SHMMAP:       
8fd0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8fe0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20  IOERR_SHMMAP";  
8ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9000: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
9010: 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20  RR_SEEK:        
9020: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9030: 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20  _IOERR_SEEK";   
9040: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9050: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
9060: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
9070: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
9080: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
9090: 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20  OENT";break;.   
90a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
90b0: 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20  OERR_MMAP:      
90c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
90d0: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20  TE_IOERR_MMAP"; 
90e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
90f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9100: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
9110: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
9120: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
9130: 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  PPATH"; break;. 
9140: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9150: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a  _IOERR_CONVPATH:
9160: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9170: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
9180: 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATH";    break;.
9190: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
91a0: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
91b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
91c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
91d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
91e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
91f0: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a  TE_CORRUPT_VTAB:
9200: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9210: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
9220: 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  TAB";      break
9230: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9240: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
9250: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9260: 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  "SQLITE_NOTFOUND
9270: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
9280: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9290: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
92a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
92b0: 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20   "SQLITE_FULL"; 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
92d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
92e0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
92f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9300: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
9310: 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  EN";          br
9320: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9330: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
9340: 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65  NOTEMPDIR: zName
9350: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
9360: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62  PEN_NOTEMPDIR";b
9370: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9380: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9390: 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d  _ISDIR:     zNam
93a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
93b0: 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20  OPEN_ISDIR";    
93c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
93d0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
93e0: 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61  N_FULLPATH:  zNa
93f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
9400: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b  TOPEN_FULLPATH";
9410: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9420: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
9430: 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e  EN_CONVPATH:  zN
9440: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
9450: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22  NTOPEN_CONVPATH"
9460: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9470: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
9480: 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  COL:           z
9490: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
94a0: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
94b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
94c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
94d0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
94e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
94f0: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20  EMPTY";         
9500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9510: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
9520: 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20  EMA:            
9530: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9540: 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20  _SCHEMA";       
9550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9560: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
9570: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
9580: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9590: 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20  E_TOOBIG";      
95a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
95b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
95c0: 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20  ONSTRAINT:      
95d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
95e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
95f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9600: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9610: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
9620: 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  E:  zName = "SQL
9630: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
9640: 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20  NIQUE"; break;. 
9650: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9660: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
9670: 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  GER: zName = "SQ
9680: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9690: 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a  TRIGGER";break;.
96a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
96b0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
96c0: 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20  EIGNKEY:.       
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
96f0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9700: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b  INT_FOREIGNKEY";
9710: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9720: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
9730: 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20  TRAINT_CHECK:   
9740: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9750: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
9760: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
9770: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9780: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
9790: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
97c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
97d0: 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72  RIMARYKEY";   br
97e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
97f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9800: 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65  T_NOTNULL: zName
9810: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
9820: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62  RAINT_NOTNULL";b
9830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9840: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9850: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20  NT_COMMITHOOK:. 
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9880: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9890: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
98a0: 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a  HOOK";   break;.
98b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
98c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
98d0: 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  B:    zName = "S
98e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
98f0: 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b  _VTAB";   break;
9900: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9910: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
9920: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20  NCTION:.        
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9950: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
9960: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20  NT_FUNCTION";   
9970: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9980: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9990: 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a  RAINT_ROWID:   z
99a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
99b0: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22  ONSTRAINT_ROWID"
99c0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
99d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
99e0: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
99f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9a00: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
9a10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9a20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
9a30: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
9a40: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a50: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
9a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9a80: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
9a90: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9aa0: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
9ab0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9ac0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
9ad0: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
9ae0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9af0: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
9b00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9b10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9b20: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
9b30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9b40: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
9b50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9b60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9b70: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
9b80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9b90: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
9ba0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9bb0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9bc0: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
9bd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9be0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
9bf0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9c00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9c10: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
9c20: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9c30: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
9c40: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9c50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9c60: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
9c70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9c80: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9ca0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9cb0: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
9cc0: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
9cd0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
9ce0: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
9cf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9d00: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
9d10: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9d40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9d50: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
9d60: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
9d70: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9d80: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
9d90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9da0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
9db0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9dc0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9dd0: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
9de0: 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  NDEX:  zName = "
9df0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
9e00: 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  UTOINDEX"; break
9e10: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9e20: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
9e30: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9e40: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9e60: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
9e70: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
9e80: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
9e90: 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
9ea0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9eb0: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
9ec0: 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57  , "SQLITE_UNKNOW
9ed0: 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b  N(%d)", origRc);
9ee0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75  .    zName = zBu
9ef0: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
9f00: 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
9f10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9f20: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
9f30: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
9f40: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
9f50: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
9f60: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
9f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
9f80: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
9f90: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
9fa0: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
9fb0: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
9fc0: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
9fd0: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
9fe0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
9ff0: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
a000: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
a010: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
a020: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
a030: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
a040: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
a050: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
a060: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
a070: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
a080: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a090: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
a0a0: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
a0b0: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
a0c0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a0d0: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
a0e0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
a0f0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a100: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
a110: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
a120: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
a130: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
a140: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
a150: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
a160: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
a170: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
a180: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
a190: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
a1a0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
a1b0: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
a1c0: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
a1d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
a1e0: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
a1f0: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
a200: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
a210: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
a220: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
a230: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
a240: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
a250: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
a260: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
a270: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
a280: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
a290: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
a2a0: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
a2b0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
a2c0: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
a2d0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
a2e0: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
a2f0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
a300: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
a310: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
a320: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
a330: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
a340: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
a350: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
a360: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
a370: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
a380: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
a390: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
a3a0: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
a3b0: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
a3c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
a3d0: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
a3e0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
a3f0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a400: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
a410: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
a420: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
a430: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
a440: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
a450: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
a460: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
a470: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
a480: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
a490: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
a4a0: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
a4b0: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
a4c0: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
a4d0: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
a4e0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
a4f0: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
a500: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
a510: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
a520: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
a530: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
a540: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
a550: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
a560: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
a570: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
a580: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
a590: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
a5a0: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
a5b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
a5c0: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
a5d0: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
a5e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
a5f0: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
a600: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
a610: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
a620: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
a630: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a640: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
a650: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
a660: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
a670: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
a680: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
a690: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
a6a0: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
a6b0: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
a6c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a6d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a6e0: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
a6f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
a700: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
a710: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
a720: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
a730: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
a740: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
a750: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
a760: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
a770: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
a780: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
a790: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
a7a0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
a7b0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a7c0: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
a7d0: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
a7e0: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
a7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
a800: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a810: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a830: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
a840: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
a850: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
a860: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
a870: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
a880: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
a890: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
a8a0: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
a8b0: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
a8c0: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
a8d0: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
a8e0: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
a8f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
a900: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
a910: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
a920: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
a930: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
a940: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
a950: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
a960: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
a970: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
a980: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
a990: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
a9a0: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
a9b0: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
a9c0: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
a9d0: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
a9e0: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
a9f0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
aa00: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
aa10: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
aa20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
aa30: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
aa40: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
aa50: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
aa60: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
aa70: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
aa80: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
aa90: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
aaa0: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
aab0: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
aac0: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
aad0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
aae0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
aaf0: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
ab00: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
ab10: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
ab20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
ab30: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
ab40: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
ab50: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
ab60: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
ab70: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
ab80: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
ab90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
aba0: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
abb0: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
abc0: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
abd0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
abe0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
abf0: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
ac00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ac10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
ac20: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
ac30: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
ac40: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
ac50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
ac60: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
ac70: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
ac80: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
ac90: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
aca0: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
acb0: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
acc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
acd0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
ace0: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
acf0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
ad00: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
ad10: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
ad20: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
ad30: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
ad40: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
ad50: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
ad60: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
ad70: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
ad80: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
ad90: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
ada0: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
adb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
adc0: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
add0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
ade0: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
adf0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
ae00: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
ae10: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
ae20: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
ae30: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
ae40: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
ae50: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
ae60: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
ae70: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
ae80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ae90: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
aea0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
aeb0: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
aec0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
aed0: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
aee0: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
aef0: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
af00: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
af10: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
af20: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
af30: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
af40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
af50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af60: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
af70: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
af80: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
af90: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
afa0: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
afb0: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
afc0: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
afd0: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
afe0: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
aff0: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
b000: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
b010: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
b020: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
b030: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b040: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
b050: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
b060: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
b070: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
b080: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
b090: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c  d *pArg.){.  sql
b0a0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b0b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
b0c0: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
b0d0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
b0e0: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
b0f0: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
b100: 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70   = (unsigned)nOp
b110: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
b120: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
b130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
b140: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
b150: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
b160: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
b170: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
b180: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
b190: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
b1a0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
b1b0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
b1c0: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
b1d0: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
b1e0: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
b1f0: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
b200: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
b210: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
b220: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
b230: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
b240: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
b250: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
b260: 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20  ms){.  if( ms>0 
b270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
b280: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
b290: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
b2a0: 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  yCallback, (void
b2b0: 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62  *)db);.    db->b
b2c0: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
b2d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b2e0: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
b2f0: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
b300: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b310: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b320: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
b330: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
b340: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
b350: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
b360: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
b370: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
b380: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31  3 *db){.  db->u1
b390: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
b3a0: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
b3b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
b3c0: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
b3d0: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
b3e0: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
b3f0: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
b400: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
b410: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
b420: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
b430: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
b440: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
b450: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
b460: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
b470: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
b480: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
b490: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
b4a0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
b4b0: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
b4c0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
b4d0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
b4e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b4f0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
b500: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
b510: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
b520: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
b530: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
b540: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
b550: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
b560: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
b570: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
b580: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
b590: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
b5a0: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
b5b0: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75  _context*),.  Fu
b5c0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
b5d0: 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46  estructor.){.  F
b5e0: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
b5f0: 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78   nName;.  int ex
b600: 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73  traFlags;..  ass
b610: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b620: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
b630: 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e  x) );.  if( zFun
b640: 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a  ctionName==0 ||.
b650: 20 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20        (xFunc && 
b660: 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70  (xFinal || xStep
b670: 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78  )) || .      (!x
b680: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
b690: 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20  && !xStep)) ||. 
b6a0: 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20       (!xFunc && 
b6b0: 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65  (!xFinal && xSte
b6c0: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41  p)) ||.      (nA
b6d0: 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51  rg<-1 || nArg>SQ
b6e0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
b6f0: 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20  N_ARG) ||.      
b700: 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71  (255<(nName = sq
b710: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a  lite3Strlen30( z
b720: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20  FunctionName))) 
b730: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
b740: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
b750: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
b760: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
b770: 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45  STANT==SQLITE_DE
b780: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
b790: 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e   extraFlags = en
b7a0: 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45  c &  SQLITE_DETE
b7b0: 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63  RMINISTIC;.  enc
b7c0: 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43   &= (SQLITE_FUNC
b7d0: 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f  _ENCMASK|SQLITE_
b7e0: 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66  ANY);.  .#ifndef
b7f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
b800: 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  16.  /* If SQLIT
b810: 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
b820: 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
b830: 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
b840: 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
b850: 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
b860: 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
b870: 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
b880: 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
b890: 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
b8a0: 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
b8b0: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
b8c0: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  rnally..  **.  *
b8d0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20  * If SQLITE_ANY 
b8e0: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64  is specified, ad
b8f0: 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73  d three versions
b900: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
b910: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73  .  ** to the has
b920: 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  h table..  */.  
b930: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
b940: 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63  UTF16 ){.    enc
b950: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
b960: 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69  ATIVE;.  }else i
b970: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41  f( enc==SQLITE_A
b980: 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  NY ){.    int rc
b990: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
b9a0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
b9b0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
b9c0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
b9d0: 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  8|extraFlags,.  
b9e0: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
b9f0: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
ba00: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
ba10: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
ba20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ba30: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ba40: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ba50: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
ba60: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
ba70: 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  6LE|extraFlags,.
ba80: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
ba90: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
baa0: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
bab0: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
bac0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
bae0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
baf0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
bb00: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
bb10: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
bb20: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
bb30: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
bb40: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
bb50: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
bb60: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
bb70: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
bb80: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
bb90: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
bba0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
bbb0: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
bbc0: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
bbd0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
bbe0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
bbf0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
bc00: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
bc10: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
bc20: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
bc30: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
bc40: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
bc50: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
bc60: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
bc70: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
bc80: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
bc90: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
bca0: 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46  ( p && (p->funcF
bcb0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
bcc0: 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63  NC_ENCMASK)==enc
bcd0: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
bce0: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
bcf0: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
bd00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bd10: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
bd20: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
bd30: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
bd40: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
bd50: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
bd60: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
bd70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
bd80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bd90: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
bda0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
bdb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
bdc0: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
bdd0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
bde0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bdf0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
be00: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
be10: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
be20: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
be30: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
be40: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
be50: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
be60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
be70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
be80: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
be90: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
bea0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
beb0: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
bec0: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
bed0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
bee0: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
bef0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
bf00: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
bf10: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
bf20: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
bf30: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
bf40: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
bf50: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
bf60: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
bf70: 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  ;.  p->funcFlags
bf80: 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73   = (p->funcFlags
bf90: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
bfa0: 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46  NCMASK) | extraF
bfb0: 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65  lags;.  testcase
bfc0: 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  ( p->funcFlags &
bfd0: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
bfe0: 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46  ISTIC );.  p->xF
bff0: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
c000: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
c010: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
c020: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
c030: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
c040: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
c050: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
c060: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
c080: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
c090: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
c0a0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c0b0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
c0c0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
c0d0: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
c0e0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
c0f0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
c100: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
c110: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
c120: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c130: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
c140: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
c150: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c160: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
c170: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
c180: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
c190: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
c1a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c1b0: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
c1c0: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
c1d0: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
c210: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
c220: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
c230: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
c250: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
c260: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
c270: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
c280: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
c290: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c2a0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
c2b0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
c2c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
c2d0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
c2e0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
c2f0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
c300: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
c310: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
c320: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
c330: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
c340: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
c350: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71   *pArg = 0;.  sq
c360: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c370: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c380: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
c390: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
c3a0: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
c3b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c3c0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
c3d0: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
c3e0: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
c3f0: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
c400: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
c410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
c420: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
c430: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
c440: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
c450: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
c460: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c470: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
c480: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
c490: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67  ep, xFinal, pArg
c4a0: 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26  );.  if( pArg &&
c4b0: 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29   pArg->nRef==0 )
c4c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
c4d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
c4e0: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
c4f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c500: 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d  e(db, pArg);.  }
c510: 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73  .. out:.  rc = s
c520: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
c530: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
c540: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c550: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c560: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
c570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
c580: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
c590: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
c5a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
c5b0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
c5c0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
c5d0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
c5e0: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
c5f0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
c600: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
c610: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c620: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c630: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c640: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c650: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
c660: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
c670: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
c680: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
c690: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
c6a0: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
c6b0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
c6c0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
c6d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c6e0: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
c6f0: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
c700: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
c710: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
c720: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
c730: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
c740: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
c750: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
c760: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
c770: 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71   xFinal,0);.  sq
c780: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c790: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
c7a0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
c7b0: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
c7c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
c7d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
c7e0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
c7f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
c800: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
c810: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
c820: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
c830: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
c840: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
c850: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
c860: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
c870: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
c880: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
c890: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
c8a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
c8b0: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
c8c0: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
c8d0: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
c8e0: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
c8f0: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
c900: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
c910: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
c920: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
c930: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
c940: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
c950: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
c960: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
c970: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
c980: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
c990: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
c9a0: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
c9b0: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
c9c0: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
c9d0: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
c9e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
c9f0: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
ca00: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
ca10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ca20: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
ca30: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
ca40: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
ca50: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  Name);.  int rc 
ca60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
ca70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ca80: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ca90: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
caa0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
cab0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
cac0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
cad0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
cae0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
caf0: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
cb00: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
cb30: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
cb40: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
cb50: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
cb60: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
cb70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
cb80: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cb90: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
cba0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
cbb0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
cbc0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
cbd0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
cbe0: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
cbf0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
cc00: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
cc10: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
cc20: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
cc30: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
cc40: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
cc50: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
cc60: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
cc70: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
cc80: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
cc90: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
cca0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
ccb0: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
ccc0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
ccd0: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
cce0: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
ccf0: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
cd00: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
cd10: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
cd20: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
cd30: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
cd40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
cd50: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
cd60: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
cd70: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
cd80: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
cd90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
cda0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
cdb0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
cdc0: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
cdd0: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
cde0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
cdf0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
ce00: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
ce10: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
ce20: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
ce30: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
ce40: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
ce50: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
ce60: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
ce70: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
ce80: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
ce90: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
cea0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
ceb0: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
cec0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
ced0: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
cee0: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
cef0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
cf00: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
cf10: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
cf20: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
cf30: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
cf40: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
cf50: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
cf60: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
cf70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
cf80: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
cf90: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
cfa0: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
cfb0: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
cfc0: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
cfd0: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
cfe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
cff0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d000: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
d010: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d020: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
d030: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
d040: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
d050: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
d060: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
d070: 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mits..** If the 
d080: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
d090: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
d0a0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
d0b0: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
d0c0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
d0d0: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
d0e0: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
d0f0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d100: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d110: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d120: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
d130: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
d140: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
d150: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
d160: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
d170: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d190: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d1a0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d1b0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
d1c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d1d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d1e0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
d1f0: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
d200: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
d210: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
d220: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
d230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d240: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d250: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
d260: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
d270: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
d280: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
d290: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
d2a0: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
d2b0: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
d2c0: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
d2d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
d2e0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
d2f0: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
d300: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
d320: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
d330: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
d340: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
d350: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
d360: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
d370: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
d380: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
d390: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
d3a0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
d3b0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
d3c0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
d3d0: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
d3e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d3f0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
d400: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
d410: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
d420: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
d430: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
d440: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
d450: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d460: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d470: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
d480: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
d490: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
d4a0: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
d4b0: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
d4c0: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
d4d0: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
d4e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
d4f0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
d500: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
d510: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
d530: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
d540: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
d550: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
d560: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
d570: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
d580: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
d590: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d5a0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
d5b0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
d5c0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
d5d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d5e0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d5f0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
d600: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
d610: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
d620: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d630: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
d640: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
d650: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d660: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d670: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
d680: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d690: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
d6a0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
d6b0: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
d6c0: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
d6d0: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
d6e0: 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
d6f0: 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
d700: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
d710: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
d720: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
d730: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d740: 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
d750: 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
d760: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
d770: 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
d780: 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
d790: 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
d7a0: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
d7b0: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
d7c0: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
d7d0: 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
d7e0: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
d7f0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
d800: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
d810: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
d820: 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
d830: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
d840: 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
d850: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
d860: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
d870: 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
d880: 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
d890: 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
d8a0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
d8b0: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
d8c0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
d8d0: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
d8e0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
d8f0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
d900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d910: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d920: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
d930: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
d940: 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
d950: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
d960: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
d970: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
d980: 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
d990: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
d9a0: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
d9b0: 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
d9c0: 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
d9d0: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
d9e0: 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
d9f0: 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
da00: 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
da10: 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
da20: 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
da30: 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
da40: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
da50: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
da60: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
da70: 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
da80: 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
da90: 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
daa0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
dab0: 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
dac0: 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
dad0: 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
dae0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
daf0: 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
db00: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
db10: 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
db20: 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
db30: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
db40: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
db50: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
db60: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
db70: 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
db80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
db90: 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
dba0: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
dbb0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
dbc0: 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
dbd0: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
dbe0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
dbf0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
dc00: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
dc10: 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
dc20: 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
dc30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
dc40: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
dc50: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
dc60: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
dc70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dc80: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
dc90: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
dca0: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
dcb0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
dcc0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
dcd0: 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
dce0: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
dcf0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
dd00: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
dd10: 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
dd20: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
dd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
dd40: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
dd50: 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
dd60: 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
dd70: 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
dd80: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
dd90: 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
dda0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ddc0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
ddd0: 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
dde0: 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
ddf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
de00: 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
de10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
de20: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
de30: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
de40: 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
de50: 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
de60: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
de70: 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
de80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
de90: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
dea0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
deb0: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
dec0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ded0: 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
dee0: 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
def0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
df00: 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
df10: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df30: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
df40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
df50: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
df60: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
df70: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
df80: 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
df90: 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
dfc0: 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
dfd0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
e000: 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
e010: 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
e020: 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
e030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
e040: 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
e050: 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
e060: 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
e070: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e080: 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
e090: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
e0a0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e0d0: 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
e0e0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
e0f0: 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
e100: 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
e110: 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
e120: 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  /..  /* Initiali
e130: 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
e140: 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
e150: 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
e160: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
e170: 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
e180: 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
e190: 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
e1a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
e1b0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
e1c0: 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL>SQLITE_CHECK
e1d0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b  POINT_PASSIVE );
e1e0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
e1f0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
e200: 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  L<SQLITE_CHECKPO
e210: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20  INT_RESTART );. 
e220: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
e230: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
e240: 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45  VE+2==SQLITE_CHE
e250: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
e260: 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
e270: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e280: 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
e290: 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
e2a0: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20  INT_RESTART ){. 
e2b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e2c0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
e2d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e2e0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e2f0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
e300: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
e310: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
e320: 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
e330: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
e340: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e350: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
e360: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
e370: 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
e380: 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
e390: 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
e3a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e3b0: 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
e3c0: 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
e3d0: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
e3e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
e3f0: 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72   rc, 0);.  }.  r
e400: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
e410: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
e420: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e430: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
e440: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
e450: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
e460: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
e470: 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
e480: 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
e490: 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
e4a0: 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
e4b0: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
e4c0: 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
e4d0: 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
e4e0: 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
e4f0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e500: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
e510: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
e520: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
e530: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e540: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
e550: 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  v2(db, zDb, SQLI
e560: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
e570: 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a  SSIVE, 0, 0);.}.
e580: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e590: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52  OMIT_WAL./*.** R
e5a0: 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
e5b0: 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
e5c0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
e5d0: 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
e5e0: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
e5f0: 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
e600: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
e610: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
e620: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
e630: 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63  abase being chec
e640: 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a  kpointed, this .
e650: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
e660: 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
e670: 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69  D and a checkpoi
e680: 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  nt is not attemp
e690: 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ted. If .** an e
e6a0: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
e6b0: 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68  e running the ch
e6c0: 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c  eckpoint, an SQL
e6d0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
e6e0: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28  s .** returned (
e6f0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
e700: 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  R). Otherwise, S
e710: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
e720: 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  The mutex on dat
e730: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20  abase handle db 
e740: 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62  should be held b
e750: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
e760: 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63  e mutex.** assoc
e770: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
e780: 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62  pecific b-tree b
e790: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
e7a0: 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a  d is taken by.**
e7b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
e7c0: 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f  hile the checkpo
e7d0: 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  int is running..
e7e0: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20  **.** If iDb is 
e7f0: 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41  passed SQLITE_MA
e800: 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e  X_ATTACHED, then
e810: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
e820: 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63  tabases are.** c
e830: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20  heckpointed. If 
e840: 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
e850: 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65  untered it is re
e860: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
e870: 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d  ly -.** no attem
e880: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
e890: 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d  eckpoint any rem
e8a0: 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73  aining databases
e8b0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
e8c0: 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f  r eMode is one o
e8d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
e8e0: 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
e8f0: 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f  L or RESTART..*/
e900: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
e910: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
e920: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
e930: 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
e940: 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
e950: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e960: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e970: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e980: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
e9b0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
e9c0: 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
e9d0: 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
e9e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e9f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
ea00: 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
ea10: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
ea20: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
ea30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ea40: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
ea50: 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
ea60: 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
ea70: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
ea80: 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
ea90: 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
eaa0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
eab0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
eac0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
ead0: 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
eae0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
eaf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
eb00: 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
eb10: 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
eb20: 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
eb30: 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
eb40: 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
eb50: 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
eb60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
eb70: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
eb80: 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
eb90: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
eba0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
ebb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
ebc0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
ebd0: 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
ebe0: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
ebf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ec00: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
ec10: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ec20: 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
ec30: 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
ec40: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
ec50: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
ec60: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
ec70: 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
ec80: 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
ec90: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
eca0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
ecb0: 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
ecc0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
ecd0: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
ece0: 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
ecf0: 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
ed00: 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
ed10: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
ed20: 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
ed30: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
ed40: 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
ed50: 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
ed60: 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
ed70: 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
ed80: 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
ed90: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
eda0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
edb0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
edc0: 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
edd0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
ede0: 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
ee00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
ee10: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
ee20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
ee30: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
ee40: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
ee60: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
ee70: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
eeb0: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
eee0: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
eef0: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
ef20: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
ef30: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
ef40: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
ef50: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
ef60: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
ef70: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
ef80: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
ef90: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
efb0: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
efc0: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
f000: 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
f030: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
f040: 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
f050: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
f060: 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
f070: 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
f080: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
f090: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
f0a0: 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
f0b0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
f0c0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
f0d0: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
f0e0: 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
f0f0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
f100: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
f110: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
f120: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
f130: 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
f140: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
f150: 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  3.  return 0;.#e
f160: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
f170: 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
f180: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
f190: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
f1a0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
f1b0: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
f1c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
f1d0: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
f1e0: 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
f1f0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
f200: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
f210: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
f220: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
f230: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
f240: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
f250: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
f260: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
f270: 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
f280: 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  SE_BKPT);.  }.  
f290: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f2a0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f2b0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f2c0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
f2d0: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
f2e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
f2f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74   }else{.    test
f300: 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d  case( db->pErr==
f310: 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  0 );.    z = (ch
f320: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
f330: 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
f340: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
f350: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f360: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
f370: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
f380: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
f390: 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
f3a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f3b0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f3c0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
f3d0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f3e0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
f3f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
f400: 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
f410: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
f420: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
f430: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
f440: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
f450: 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
f460: 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
f470: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
f480: 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
f490: 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
f4a0: 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
f4b0: 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
f4c0: 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
f4d0: 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
f4e0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f4f0: 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
f500: 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62      'l', 'i', 'b
f510: 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27  ', 'r', 'a', 'r'
f520: 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'y', ' ', .   
f530: 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20   'r', 'o', 'u', 
f540: 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27  't', 'i', 'n', '
f550: 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63  e', ' ', .    'c
f560: 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27  ', 'a', 'l', 'l'
f570: 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'e', 'd', ' ',
f580: 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20   .    'o', 'u', 
f590: 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  't', ' ', .    '
f5a0: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20  o', 'f', ' ', . 
f5b0: 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27     's', 'e', 'q'
f5c0: 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c  , 'u', 'e', 'n',
f5d0: 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   'c', 'e', 0.  }
f5e0: 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
f5f0: 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
f600: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
f610: 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
f620: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
f630: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
f640: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
f650: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
f660: 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
f670: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f680: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
f690: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f6a0: 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
f6b0: 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
f6c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
f6d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f6e0: 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
f6f0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
f700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f710: 72 6f 72 28 64 62 2c 20 64 62 2d 3e 65 72 72 43  ror(db, db->errC
f720: 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53  ode, sqlite3ErrS
f730: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29  tr(db->errCode))
f740: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
f750: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
f760: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
f770: 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
f780: 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
f790: 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
f7a0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
f7b0: 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
f7c0: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
f7d0: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
f7e0: 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
f7f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
f800: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
f810: 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
f820: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
f830: 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
f840: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
f850: 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
f860: 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
f870: 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
f880: 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
f890: 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
f8a0: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
f8b0: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  Failed = 0;.  }.
f8c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f8d0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
f8e0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
f8f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f900: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
f910: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
f920: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
f930: 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
f940: 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
f950: 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
f960: 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
f970: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
f980: 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
f990: 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
f9a0: 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
f9b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f9c0: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
f9d0: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
f9e0: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
f9f0: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
fa00: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
fa10: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
fa20: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
fa30: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
fa40: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
fa50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
fa60: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
fa70: 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
fa80: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
fa90: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
faa0: 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
fab0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
fac0: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
fad0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
fae0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
faf0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
fb00: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
fb10: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
fb20: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
fb30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
fb40: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
fb50: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
fb60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
fb70: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
fb80: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
fb90: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
fba0: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
fbb0: 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  ment.  For now, 
fbc0: 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c  this simply call
fbd0: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
fbe0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a  qlite3ErrStr().*
fbf0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  * function..*/.c
fc00: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
fc10: 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63  e3_errstr(int rc
fc20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
fc30: 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d  te3ErrStr(rc);.}
fc40: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
fc50: 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20 4b 65  te all cached Ke
fc60: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 66 6f  yInfo objects fo
fc70: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
fc80: 63 74 69 6f 6e 20 22 64 62 22 0a 2a 2f 0a 73 74  ction "db".*/.st
fc90: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
fca0: 64 61 74 65 43 61 63 68 65 64 4b 65 79 49 6e 66  dateCachedKeyInf
fcb0: 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  o(sqlite3 *db){.
fcc0: 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fce0: 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
fcf0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd10: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
fd20: 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
fd30: 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
fd40: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
fd50: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
fd60: 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
fd70: 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
fd80: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
fd90: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
fda0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
fdb0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
fdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fdd0: 20 2f 2a 20 45 61 63 68 20 69 6e 64 65 78 20 2a   /* Each index *
fde0: 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
fdf0: 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
fe00: 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
fe10: 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28   pDb++){.    if(
fe20: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 20 63   pDb->pBt==0 ) c
fe30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
fe40: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
fe50: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 66 6f  Db->pBt);.    fo
fe60: 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
fe70: 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
fe80: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
fe90: 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
fea0: 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
feb0: 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
fec0: 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
fed0: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
fee0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
fef0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ff00: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
ff10: 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20   pIdx->pKeyInfo 
ff20: 26 26 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66  && pIdx->pKeyInf
ff30: 6f 2d 3e 64 62 3d 3d 64 62 20 29 7b 0a 20 20 20  o->db==db ){.   
ff40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
ff50: 79 49 6e 66 6f 55 6e 72 65 66 28 70 49 64 78 2d  yInfoUnref(pIdx-
ff60: 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
ff70: 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b 65 79        pIdx->pKey
ff80: 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  Info = 0;.      
ff90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ffa0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
ffb0: 65 65 4c 65 61 76 65 28 70 44 62 2d 3e 70 42 74  eeLeave(pDb->pBt
ffc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ffd0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
ffe0: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
fff0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
10000 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
10010 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
10020 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
10030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10040 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
10050 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a  .  sqlite3* db,.
10060 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10070 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a  ame, .  u8 enc,.
10080 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
10090 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
100a0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
100b0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
100c0 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
100d0 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
100e0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
100f0 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69  .  int enc2;.  i
10100 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  nt nName = sqlit
10110 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
10120 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
10130 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10140 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
10150 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
10160 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
10170 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
10180 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
10190 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
101a0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
101b0 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
101c0 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
101d0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
101e0 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
101f0 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
10200 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
10210 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
10220 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74  c2 = enc;.  test
10230 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
10240 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65  TE_UTF16 );.  te
10250 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
10260 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
10270 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32  ED );.  if( enc2
10280 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c  ==SQLITE_UTF16 |
10290 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  | enc2==SQLITE_U
102a0 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a  TF16_ALIGNED ){.
102b0 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
102c0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
102d0 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51   }.  if( enc2<SQ
102e0 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
102f0 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  2>SQLITE_UTF16BE
10300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10310 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10320 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
10330 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
10340 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
10350 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
10360 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
10370 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
10380 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
10390 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
103a0 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
103b0 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
103c0 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
103d0 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
103e0 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
103f0 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
10400 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10410 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
10420 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
10430 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
10440 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
10450 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
10460 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
10470 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
10480 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
10490 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
104a0 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
104b0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
104c0 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
104d0 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
104e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
104f0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
10500 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
10510 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
10520 74 73 28 64 62 29 3b 0a 20 20 20 20 69 6e 76 61  ts(db);.    inva
10530 6c 69 64 61 74 65 43 61 63 68 65 64 4b 65 79 49  lidateCachedKeyI
10540 6e 66 6f 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nfo(db);..    /*
10550 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
10560 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
10570 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
10580 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
10590 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
105a0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
105b0 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
105c0 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
105d0 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
105e0 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
105f0 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
10600 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
10610 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
10620 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
10630 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
10640 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
10650 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
10660 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
10670 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
10680 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
10690 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
106a0 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
106b0 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
106c0 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
106d0 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
106e0 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
106f0 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
10700 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
10710 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
10720 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
10730 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
10740 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
10750 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
10760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
10770 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
10780 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
10790 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
107a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
107b0 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
107c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
107d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
107e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
107f0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
10800 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
10810 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
10820 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
10830 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  NOMEM;.  pColl->
10840 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
10850 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
10860 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
10870 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
10880 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
10890 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
108a0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
108b0 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65  GNED));.  sqlite
108c0 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
108d0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75  E_OK, 0);.  retu
108e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
108f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
10900 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
10910 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
10920 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
10930 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
10940 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
10950 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
10960 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
10970 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
10980 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
10990 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
109a0 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
109b0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
109c0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
109d0 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
109e0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
109f0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
10a00 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
10a10 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
10a20 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
10a30 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
10a40 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10a50 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
10a60 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
10a70 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
10a80 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
10a90 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
10aa0 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a  ARIABLE_NUMBER,.
10ab0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49    SQLITE_MAX_TRI
10ac0 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a  GGER_DEPTH,.};..
10ad0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10ae0 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
10af0 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
10b00 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
10b10 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
10b20 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
10b30 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
10b40 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
10b50 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
10b60 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
10b70 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
10b80 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10b90 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
10ba0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
10bb0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10bc0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10bd0 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
10be0 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
10bf0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10c00 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
10c10 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
10c20 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
10c30 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10c40 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
10c50 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
10c60 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
10c70 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
10c80 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
10c90 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10ca0 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
10cb0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
10cc0 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
10cd0 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
10ce0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10cf0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
10d00 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
10d10 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a  NCTION_ARG>1000.
10d20 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10d30 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
10d40 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
10d50 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69  0 and 1000.#endi
10d60 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10d70 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
10d80 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10d90 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51  ED>62.# error SQ
10da0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10db0 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
10dc0 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69  n 0 and 62.#endi
10dd0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10de0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
10df0 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
10e00 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
10e10 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
10e20 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
10e30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10e40 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32  TE_MAX_COLUMN>32
10e50 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  767.# error SQLI
10e60 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75  TE_MAX_COLUMN mu
10e70 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32  st not exceed 32
10e80 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  767.#endif.#if S
10e90 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
10ea0 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f  R_DEPTH<1.# erro
10eb0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  r SQLITE_MAX_TRI
10ec0 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20  GGER_DEPTH must 
10ed0 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
10ee0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
10ef0 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
10f00 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72   a limit.  Repor
10f10 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e  t the old value.
10f20 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  .** If an invali
10f30 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73  d limit index is
10f40 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72   supplied, repor
10f50 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  t -1..** Make no
10f60 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69   changes but sti
10f70 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c  ll report the ol
10f80 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a  d value if the.*
10f90 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e  * new limit is n
10fa0 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  egative..**.** A
10fb0 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74   new lower limit
10fc0 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b   does not shrink
10fd0 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72   existing constr
10fe0 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65  ucts..** It mere
10ff0 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20  ly prevents new 
11000 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20  constructs that 
11010 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74  exceed the limit
11020 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67  .** from forming
11030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11040 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  _limit(sqlite3 *
11050 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c  db, int limitId,
11060 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a   int newLimit){.
11070 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a    int oldLimit;.
11080 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
11090 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
110a0 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
110b0 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
110c0 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
110d0 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
110e0 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
110f0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11100 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
11110 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
11120 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
11130 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
11140 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
11150 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
11160 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
11170 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
11180 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11190 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
111a0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
111b0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
111c0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
111d0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
111e0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
111f0 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
11200 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11210 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
11220 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
11230 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
11240 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11250 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
11260 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
11270 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
11280 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
11290 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
112a0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
112b0 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
112c0 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
112d0 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
112e0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
112f0 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
11300 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
11310 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
11320 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
11330 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
11340 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
11350 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
11360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
11370 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
11380 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
11390 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
113a0 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
113b0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
113c0 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
113d0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
113e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
11420 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
11430 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
11440 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
11450 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
11460 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
11470 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
11480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11490 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
114a0 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
114b0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
114c0 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
114d0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
114e0 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
114f0 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e  DEPTH==(SQLITE_N
11500 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
11510 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
11520 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
11530 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
11540 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
11550 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
11560 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
11570 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
11580 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
11590 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
115a0 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
115b0 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
115c0 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
115d0 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
115e0 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
115f0 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
11600 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
11610 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
11620 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
11630 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
11640 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
11650 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11670 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
11680 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
11690 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
116a0 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
116b0 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
116c0 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
116d0 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
116e0 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
116f0 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
11700 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
11710 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
11720 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
11730 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
11740 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
11750 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
11760 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
11770 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
11780 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
11790 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
117a0 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
117b0 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
117c0 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
117d0 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
117e0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
117f0 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
11800 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
11810 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
11820 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
11830 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
11840 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
11850 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
11860 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
11870 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
11880 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
11890 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
118a0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
118b0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
118c0 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
118d0 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
118e0 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
118f0 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
11900 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
11910 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
11920 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
11930 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
11940 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
11950 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
11960 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
11970 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11980 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
11990 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
119a0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
119b0 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
119c0 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
119d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
119e0 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
119f0 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
11a00 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
11a10 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
11a20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
11a30 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
11a40 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
11a50 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
11a60 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
11a70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
11a80 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
11a90 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
11aa0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11ab0 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
11ac0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
11ad0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
11ae0 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
11af0 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
11b00 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
11b10 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
11b20 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
11b30 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
11b40 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
11b50 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
11b60 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
11b70 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
11b80 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
11b90 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
11ba0 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
11bb0 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
11bc0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
11bd0 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
11be0 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
11bf0 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
11c00 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
11c10 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c30 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
11c40 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
11c50 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
11c60 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
11c70 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
11c80 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
11c90 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
11ca0 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
11cb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11cc0 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
11cd0 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
11d00 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
11d10 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
11d20 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
11d30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11d40 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
11d50 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
11d60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
11d70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11d80 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
11d90 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
11da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
11db0 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
11dc0 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
11dd0 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
11de0 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
11df0 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
11e00 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
11e10 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
11e20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
11e30 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69  PEN_URI) || sqli
11e40 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11e50 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26  bOpenUri) .   &&
11e60 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63   nUri>=5 && memc
11e70 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22  mp(zUri, "file:"
11e80 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  , 5)==0 .  ){.  
11e90 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
11ea0 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ec0 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
11ed0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
11ee0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
11f10 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
11f20 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
11f30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11f40 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
11f50 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
11f60 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
11f70 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
11f80 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
11f90 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
11fa0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
11fb0 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
11fc0 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
11fd0 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
11fe0 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
11ff0 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
12000 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
12010 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
12020 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
12030 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
12040 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
12050 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
12060 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
12070 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
12080 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
12090 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
120a0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
120b0 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
120c0 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
120d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
120e0 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20  MEM;..    iIn = 
120f0 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  5;.#ifndef SQLIT
12100 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
12110 4f 52 49 54 59 0a 20 20 20 20 2f 2a 20 44 69 73  ORITY.    /* Dis
12120 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
12130 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
12140 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
12150 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
12160 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
12170 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
12180 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
12190 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
121a0 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
121b0 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
121c0 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
121d0 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
121e0 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
121f0 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
12200 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
12210 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
12220 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
12230 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
12240 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
12250 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
12260 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
12270 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
12280 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
12290 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
122a0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
122b0 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
122c0 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
122d0 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
122e0 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
122f0 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
12300 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
12310 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
12320 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
12330 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
12340 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
12350 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
12360 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
12370 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
12380 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
12390 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
123a0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
123b0 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
123c0 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
123d0 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
123e0 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
123f0 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
12400 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
12410 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
12420 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
12430 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
12440 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
12450 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
12460 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
12470 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
12480 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
12490 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
124a0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
124b0 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
124c0 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
124d0 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
124e0 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
124f0 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
12500 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
12510 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
12520 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
12530 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
12540 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
12550 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
12560 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
12570 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
12580 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
12590 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
125a0 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
125b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
125c0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
125d0 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25  is taken when "%
125e0 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68  00" appears with
125f0 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74  in the URI. In t
12600 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
12610 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20   case we ignore 
12620 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20  all text in the 
12630 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
12640 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20   path, name or. 
12650 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
12660 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
12670 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e  g parsed. So ign
12680 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
12690 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20  character.      
126a0 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20      ** and skip 
126b0 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c  to the next "?",
126c0 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20   "=" or "&", as 
126d0 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a  appropriate. */.
126e0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
126f0 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
12700 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20  !=0 && c!='#' . 
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
12720 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21  (eState!=0 || c!
12730 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='?').          
12740 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
12750 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20  1 || (c!='=' && 
12760 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20  c!='&')).       
12770 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
12780 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a  e!=2 || c!='&').
12790 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
127a0 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a           iIn++;.
127b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
127c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
127d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
127e0 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20    c = octet;.   
127f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
12800 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26  ate==1 && (c=='&
12810 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a  ' || c=='=') ){.
12820 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
12830 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a  e[iOut-1]==0 ){.
12840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
12850 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d  empty option nam
12860 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f  e. Ignore this o
12870 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72  ption altogether
12880 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
12890 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
128a0 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23  && zUri[iIn]!='#
128b0 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d  ' && zUri[iIn-1]
128c0 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='&' ) iIn++;. 
128d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
128e0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
128f0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20       if( c=='&' 
12900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69  ){.          zFi
12910 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
12920 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ';.        }else
12930 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
12940 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
12950 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  }.        c = 0;
12960 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
12970 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63   (eState==0 && c
12980 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74  =='?') || (eStat
12990 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20  e==2 && c=='&') 
129a0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30  ){.        c = 0
129b0 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  ;.        eState
129c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
129d0 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
129e0 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = c;.    }.   
129f0 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29   if( eState==1 )
12a00 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
12a10 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
12a20 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12a30 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
12a40 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  +] = '\0';..    
12a50 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72  /* Check if ther
12a60 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f  e were any optio
12a70 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61  ns specified tha
12a80 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65  t should be inte
12a90 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20  rpreted .    ** 
12aa0 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68  here. Options th
12ab0 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74  at are interpret
12ac0 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20  ed here include 
12ad0 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20  "vfs" and those 
12ae0 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72  that.    ** corr
12af0 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20  espond to flags 
12b00 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73  that may be pass
12b10 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
12b20 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20  3_open_v2().    
12b30 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20  ** method. */.  
12b40 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b    zOpt = &zFile[
12b50 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12b60 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77  zFile)+1];.    w
12b70 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b  hile( zOpt[0] ){
12b80 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20  .      int nOpt 
12b90 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12ba0 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63  0(zOpt);.      c
12bb0 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70  har *zVal = &zOp
12bc0 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20  t[nOpt+1];.     
12bd0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
12be0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c  te3Strlen30(zVal
12bf0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  );..      if( nO
12c00 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28  pt==3 && memcmp(
12c10 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d  "vfs", zOpt, 3)=
12c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56  =0 ){.        zV
12c30 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20  fs = zVal;.     
12c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12c50 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
12c60 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
12c70 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
12c80 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20       int mode;. 
12c90 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20         } *aMode 
12ca0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
12cb0 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30  r *zModeType = 0
12cc0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61  ;.        int ma
12cd0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
12ce0 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a  int limit = 0;..
12cf0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
12d00 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63  ==5 && memcmp("c
12d10 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d  ache", zOpt, 5)=
12d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12d30 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
12d40 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64  enMode aCacheMod
12d50 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
12d60 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20      { "shared", 
12d70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
12d80 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
12d90 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61          { "priva
12da0 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  te", SQLITE_OPEN
12db0 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
12dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
12dd0 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
12de0 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
12df0 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
12e00 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c  _SHAREDCACHE|SQL
12e10 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
12e20 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20  CACHE;.         
12e30 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d   aMode = aCacheM
12e40 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
12e50 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20  imit = mask;.   
12e60 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
12e70 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20   = "cache";.    
12e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12e90 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d  ( nOpt==4 && mem
12ea0 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74  cmp("mode", zOpt
12eb0 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
12ec0 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
12ed0 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65  ct OpenMode aOpe
12ee0 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  nMode[] = {.    
12ef0 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20          { "ro", 
12f00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
12f10 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20  DONLY },.       
12f20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51       { "rw",  SQ
12f30 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12f40 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20  ITE }, .        
12f50 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c      { "rwc", SQL
12f60 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12f70 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
12f80 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
12f90 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79         { "memory
12fa0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
12fb0 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20  EMORY },.       
12fc0 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
12fd0 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
12fe0 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
12ff0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
13000 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y | SQLITE_OPEN_
13010 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20  READWRITE.      
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
13030 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13040 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
13050 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20  MEMORY;.        
13060 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d    aMode = aOpenM
13070 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
13080 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c  imit = mask & fl
13090 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ags;.          z
130a0 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65  ModeType = "acce
130b0 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ss";.        }..
130c0 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64          if( aMod
130d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
130e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
130f0 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  int mode = 0;.  
13100 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
13110 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b   aMode[i].z; i++
13120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
13130 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
13140 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20  Mode[i].z;.     
13150 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d         if( nVal=
13160 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
13170 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  (z) && 0==memcmp
13180 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20  (zVal, z, nVal) 
13190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
131a0 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d   mode = aMode[i]
131b0 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  .mode;.         
131c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
131d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
131e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
131f0 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20  if( mode==0 ){. 
13200 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
13210 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
13220 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
13230 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d  %s mode: %s", zM
13240 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
13250 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
13260 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13270 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
13280 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
13290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
132a0 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26       if( (mode &
132b0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45   ~SQLITE_OPEN_ME
132c0 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20  MORY)>limit ){. 
132d0 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
132e0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
132f0 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
13300 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
13310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
13340 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
13350 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13360 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
13370 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
13380 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
13390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
133a0 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
133b0 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
133c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133d0 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
133e0 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
133f0 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
13400 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
13410 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32  e3_malloc(nUri+2
13420 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
13430 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
13440 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
13450 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c  cpy(zFile, zUri,
13460 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c   nUri);.    zFil
13470 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
13480 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
13490 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
134a0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
134b0 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
134c0 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
134d0 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
134e0 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
134f0 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
13500 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
13510 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
13520 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
13530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
13540 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
13550 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
13560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13570 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13580 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
13590 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
135a0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
135b0 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
135c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
135d0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
135e0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
135f0 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
13600 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
13610 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
13620 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
13630 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
13640 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13650 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
13660 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
13670 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
13680 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
13690 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
136a0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
136b0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
136c0 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
136d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
136e0 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
136f0 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
13700 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
13710 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
13720 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
13730 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
13740 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13750 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
13760 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
13770 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
13780 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
13790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
137a0 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
137b0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
137c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
137f0 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
13800 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
13810 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
13820 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
13830 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
13840 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
13850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13860 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
13870 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
13880 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
13890 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138b0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
138c0 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
138d0 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62  ri() */..  *ppDb
138e0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
138f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
13900 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
13910 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
13920 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13930 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
13940 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65  /* Only allow se
13950 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
13960 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ons of bits in t
13970 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
13980 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20  t.  .  ** Throw 
13990 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
139a0 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e  non-sense combin
139b0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ation is used.  
139c0 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f  If we.  ** do no
139d0 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20  t block illegal 
139e0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72  combinations her
139f0 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67  e, it could trig
13a00 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  ger.  ** assert(
13a10 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
13a20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20  deeper layers.  
13a30 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  Sensible combina
13a40 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a  tions.  ** are:.
13a50 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53    **.  **  1:  S
13a60 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
13a70 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51  NLY.  **  2:  SQ
13a80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13a90 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51  ITE.  **  6:  SQ
13aa0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13ab0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
13ac0 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20  N_CREATE.  */.  
13ad0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
13ae0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d  PEN_READONLY  ==
13af0 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72   0x01 );.  asser
13b00 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
13b10 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32  EADWRITE == 0x02
13b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
13b30 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13b40 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20      == 0x04 );. 
13b50 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
13b60 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20  flags&7))==0x02 
13b70 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a  ); /* READONLY *
13b80 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
13b90 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
13ba0 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  04 ); /* READWRI
13bb0 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  TE */.  testcase
13bc0 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
13bd0 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41  ==0x40 ); /* REA
13be0 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
13bf0 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66  */.  if( ((1<<(f
13c00 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29  lags&7)) & 0x46)
13c10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13c20 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
13c30 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
13c40 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
13c50 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
13c60 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
13c70 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
13c80 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13c90 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
13ca0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
13cb0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
13cc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
13cd0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
13ce0 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
13cf0 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
13d00 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
13d10 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
13d20 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
13d30 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  x;.  }.  if( fla
13d40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13d50 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b  _PRIVATECACHE ){
13d60 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
13d70 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13d80 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20  DCACHE;.  }else 
13d90 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
13da0 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
13db0 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
13dc0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
13dd0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
13de0 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  HE;.  }..  /* Re
13df0 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
13e00 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
13e10 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
13e20 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
13e30 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
13e40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
13e50 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
13e60 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
13e70 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
13e80 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
13e90 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
13ea0 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
13eb0 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
13ec0 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
13ed0 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
13ee0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
13ef0 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
13f00 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45  EADWRITE, SQLITE
13f10 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51  _OPEN_CREATE, SQ
13f20 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
13f30 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49  CACHE,.  ** SQLI
13f40 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
13f50 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72  ACHE, and some r
13f60 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53  eserved bits.  S
13f70 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
13f80 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
13f90 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
13fa0 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
13fb0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
13fc0 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
13fd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13fe0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14000 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
14010 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
14020 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
14030 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
14040 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
14050 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
14060 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
14070 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
14080 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
140a0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
140b0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
140c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
140d0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
140e0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
140f0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
14100 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14120 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
14130 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
14140 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
14150 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
14160 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
14170 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
14180 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
14190 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
141a0 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
141b0 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
141c0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
141d0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
141e0 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
141f0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14200 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
14210 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
14220 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
14230 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
14240 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
14250 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
14260 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
14270 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
14280 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
14290 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
142a0 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
142b0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
142c0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
142d0 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
142e0 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
142f0 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
14300 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
14310 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
14320 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
14330 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
14340 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
14350 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
14360 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
14370 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
14380 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
14390 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
143a0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
143b0 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
143c0 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
143d0 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
143e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
143f0 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
14400 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
14410 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
14420 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
14430 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ames | SQLITE_En
14440 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51  ableTrigger | SQ
14450 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a  LITE_CacheSpill.
14460 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
14470 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
14480 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20  MATIC_INDEX) || 
14490 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
144a0 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
144d0 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ex.#endif.#if SQ
144e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
144f0 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
14500 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
14510 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
14520 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
14530 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
14540 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14560 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
14570 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
14580 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14590 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
145a0 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
145b0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
145c0 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
145d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
145e0 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
145f0 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
14600 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
14610 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
14620 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
14630 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#e
14640 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
14650 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
14660 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
14670 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14680 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
14690 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
146a0 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
146b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
146c0 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
146d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
146e0 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
146f0 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
14700 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
14710 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
14720 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
14730 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
14740 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
14750 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
14760 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
14770 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
14780 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
14790 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ure..  */.  crea
147a0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
147b0 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
147c0 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
147d0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
147e0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
147f0 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
14800 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
14810 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
14820 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
14830 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
14840 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
14850 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
14860 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
14870 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
14880 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
14890 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
148a0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
148b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
148c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
148d0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
148e0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
148f0 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
14900 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
14910 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b  8, "BINARY", 0);
14920 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
14930 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
14940 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20    /* Also add a 
14950 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e  UTF-8 case-insen
14960 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e  sitive collation
14970 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20   sequence. */.  
14980 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
14990 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51  db, "NOCASE", SQ
149a0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f  LITE_UTF8, 0, no
149b0 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
149c0 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  c, 0);..  /* Par
149d0 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f  se the filename/
149e0 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  URI argument. */
149f0 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
14a00 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d   = flags;.  rc =
14a10 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
14a20 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
14a30 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
14a40 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
14a50 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
14a60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14a70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14a80 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61  E_NOMEM ) db->ma
14a90 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
14aa0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14ab0 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  (db, rc, zErrMsg
14ac0 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72   ? "%s" : 0, zEr
14ad0 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
14ae0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
14af0 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
14b00 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
14b10 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
14b20 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
14b30 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  r */.  rc = sqli
14b40 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
14b50 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62  >pVfs, zOpen, db
14b60 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  , &db->aDb[0].pB
14b70 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
14b90 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
14ba0 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66  N_MAIN_DB);.  if
14bb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14bc0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
14bd0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
14be0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
14bf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14c00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
14c10 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
14c20 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
14c30 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
14c40 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
14c50 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
14c60 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
14c70 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
14c80 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
14c90 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
14ca0 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68  b, 0);...  /* Th
14cb0 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
14cc0 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
14cd0 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
14ce0 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20  'full'; for the 
14cf0 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
14d00 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e  se it is 'NONE'.
14d10 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
14d20 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
14d30 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
14d40 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d   db->aDb[0].zNam
14d50 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
14d60 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
14d70 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d  level = 3;.  db-
14d80 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[1].zName = 
14d90 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44  "temp";.  db->aD
14da0 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[1].safety_leve
14db0 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61  l = 1;..  db->ma
14dc0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
14dd0 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
14de0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14df0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
14e00 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
14e10 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
14e20 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
14e30 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
14e40 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
14e50 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
14e60 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
14e70 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
14e80 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
14e90 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
14ea0 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
14eb0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
14ec0 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
14ed0 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
14ee0 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
14ef0 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
14f00 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
14f10 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
14f20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
14f30 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
14f40 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
14f50 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
14f60 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
14f70 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63  ) API..  */.  rc
14f80 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
14f90 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  de(db);.  if( rc
14fa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14fb0 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f     sqlite3AutoLo
14fc0 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  adExtensions(db)
14fd0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14fe0 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
14ff0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
15010 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
15020 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
15030 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15040 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
15050 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15060 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
15070 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
15080 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
15090 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
150a0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
150b0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
150c0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
150d0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
150e0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
150f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
15100 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
15110 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
15120 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
15130 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
15140 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
15150 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15160 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64  LE_FTS3.  if( !d
15170 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15180 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
15190 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
151a0 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
151b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
151c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
151d0 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
151e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
151f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
15200 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15210 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
15220 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
15230 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15240 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
15250 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
15260 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
15270 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15280 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
15290 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
152a0 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
152b0 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
152c0 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
152d0 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
152e0 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
152f0 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
15300 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
15310 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
15320 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
15330 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
15340 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
15350 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
15360 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
15370 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
15380 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
15390 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
153a0 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
153b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
153c0 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
153d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
153e0 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
153f0 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
15400 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
15430 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
15440 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
15450 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  c ) sqlite3Error
15460 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20  (db, rc, 0);..  
15470 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
15480 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
15490 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
154a0 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
154b0 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
154c0 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
154d0 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
154f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15500 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
15510 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
15520 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
15530 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
15540 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
15550 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
15560 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15570 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62  zOpen);.  if( db
15580 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15590 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20  db->mutex!=0 || 
155a0 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20  isThreadsafe==0 
155b0 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
155c0 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
155d0 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
155e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
155f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
15600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15610 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73  rrcode(db);.  as
15620 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72  sert( db!=0 || r
15630 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
15640 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
15650 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
15660 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
15670 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a  b);.    db = 0;.
15680 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
15690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
156a0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
156b0 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
156c0 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62    }.  *ppDb = db
156d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
156e0 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
156f0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
15700 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
15710 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e  ){.    /* Openin
15720 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46  g a db handle. F
15730 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20  ourth parameter 
15740 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a  is passed 0. */.
15750 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d      void *pArg =
15760 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15770 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b  nfig.pSqllogArg;
15780 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
15790 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
157a0 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65  (pArg, db, zFile
157b0 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  name, 0);.  }.#e
157c0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71  ndif.  return sq
157d0 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
157e0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  rc);.}../*.** Op
157f0 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
15800 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
15810 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
15820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
15830 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
15840 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
15850 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
15860 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
15870 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
15880 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
15890 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
158a0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
158b0 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
158c0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
158d0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
158e0 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
158f0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
15900 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
15910 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
15920 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
15930 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
15940 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
15950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15960 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
15970 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
15980 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
15990 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
159a0 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
159b0 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
159c0 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69  ame, ppDb, (unsi
159d0 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20  gned int)flags, 
159e0 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
159f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
15a00 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
15a10 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
15a20 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
15a30 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
15a40 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
15a50 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
15a60 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
15a70 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
15a80 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
15a90 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
15aa0 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
15ab0 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
15ac0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
15ad0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
15ae0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20  sert( zFilename 
15af0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44  );.  assert( ppD
15b00 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30  b );.  *ppDb = 0
15b10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15b20 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
15b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
15b40 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
15b50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15b60 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20  ;.#endif.  pVal 
15b70 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
15b80 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
15b90 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
15ba0 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
15bb0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
15bc0 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
15bd0 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
15be0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
15bf0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
15c00 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
15c10 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
15c20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
15c30 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
15c40 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
15c50 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
15c60 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
15c70 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
15c80 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
15c90 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
15ca0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
15cb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15cc0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
15cd0 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
15ce0 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
15cf0 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45  aded) ){.      E
15d00 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
15d10 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
15d20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
15d30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
15d40 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OMEM;.  }.  sqli
15d50 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
15d60 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71  l);..  return sq
15d70 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
15d80 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  rc);.}.#endif /*
15d90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
15da0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
15db0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
15dc0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
15dd0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
15de0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
15df0 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
15e00 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
15e10 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
15e20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
15e30 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
15e40 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
15e50 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
15e60 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15e70 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15e80 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
15e90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
15ea0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
15eb0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
15ec0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15ed0 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
15ee0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
15ef0 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
15f00 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
15f10 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15f20 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
15f30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15f40 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
15f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15f60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
15f70 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
15f80 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
15f90 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
15fa0 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
15fb0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
15fc0 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  llation_v2(.  sq
15fd0 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
15fe0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
15ff0 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
16000 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
16010 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
16020 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
16030 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
16040 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
16050 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  l)(void*).){.  i
16060 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
16070 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16080 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
16090 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
160a0 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
160b0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
160c0 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e  b, zName, (u8)en
160d0 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
160e0 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d  e, xDel);.  rc =
160f0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
16100 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
16110 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
16120 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
16130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
16140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
16150 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
16160 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
16170 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
16180 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
16190 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
161a0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
161b0 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73  collation16(.  s
161c0 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
161d0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
161e0 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20  ,.  int enc, .  
161f0 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
16200 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
16210 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
16220 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
16230 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  d*).){.  int rc 
16240 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
16250 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73  har *zName8;.  s
16260 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16270 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
16280 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
16290 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
162a0 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  zName8 = sqlite3
162b0 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61  Utf16to8(db, zNa
162c0 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
162d0 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69  TF16NATIVE);.  i
162e0 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20  f( zName8 ){.   
162f0 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
16300 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38  ation(db, zName8
16310 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
16320 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
16330 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16340 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20  (db, zName8);.  
16350 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
16360 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
16370 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16380 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
16390 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
163a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
163b0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
163c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
163d0 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
163e0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
163f0 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
16400 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
16410 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
16420 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
16430 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
16440 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
16450 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
16460 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
16470 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ded(.  sqlite3 *
16480 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
16490 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
164a0 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
164b0 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  d)(void*,sqlite3
164c0 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
164d0 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
164e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
164f0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
16500 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
16510 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  ed = xCollNeeded
16520 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
16530 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d  ded16 = 0;.  db-
16540 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
16550 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
16560 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
16570 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
16580 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
16590 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
165a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
165b0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
165c0 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
165d0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
165e0 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
165f0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
16600 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
16610 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
16620 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
16630 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
16640 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
16650 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
16660 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
16670 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
16680 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
16690 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
166a0 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
166b0 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
166c0 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
166d0 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
166e0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
166f0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
16700 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  ollNeeded = 0;. 
16710 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
16720 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  16 = xCollNeeded
16730 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e  16;.  db->pCollN
16740 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
16750 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
16760 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
16770 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
16780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16790 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
167a0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
167b0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
167c0 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
167d0 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  D./*.** This fun
167e0 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20  ction is now an 
167f0 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20  anachronism. It 
16800 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  used to be used 
16810 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
16820 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61  a.** malloc() fa
16830 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74  ilure, but SQLit
16840 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20  e now does this 
16850 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
16860 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c  /.int sqlite3_gl
16870 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69  obal_recover(voi
16880 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
16890 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
168a0 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
168b0 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
168c0 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
168d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
168e0 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d   autocommit.** m
168f0 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ode.  Return TRU
16900 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46  E if it is and F
16910 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75  ALSE if not.  Au
16920 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73  tocommit mode is
16930 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c   on.** by defaul
16940 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69  t.  Autocommit i
16950 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20  s disabled by a 
16960 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20  BEGIN statement 
16970 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a  and reenabled.**
16980 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d   by the next COM
16990 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
169a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
169b0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
169c0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
169d0 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
169e0 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
169f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
16a00 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69 74  tines are subtit
16a10 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e  utes for constan
16a20 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ts SQLITE_CORRUP
16a30 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  T,.** SQLITE_MIS
16a40 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  USE, SQLITE_CANT
16a50 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45  OPEN, SQLITE_IOE
16a60 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  RR and possibly 
16a70 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
16a80 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20  onstants.  They 
16a90 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70 6f  server two purpo
16aa0 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
16ab0 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
16ac0 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
16ad0 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
16ae0 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
16af0 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
16b00 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
16b10 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
16b20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
16b30 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
16b40 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
16b50 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
16b60 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
16b70 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
16b80 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
16b90 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
16ba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
16bb0 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
16bc0 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
16bd0 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
16be0 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
16bf0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
16c00 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
16c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16c20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
16c30 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20  tion at line %d 
16c40 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
16c50 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
16c60 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
16c70 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
16c80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16c90 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  PT;.}.int sqlite
16ca0 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
16cb0 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
16cc0 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
16cd0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
16ce0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
16cf0 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  og(SQLITE_MISUSE
16d00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
16d10 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65   "misuse at line
16d20 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
16d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
16d40 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
16d50 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
16d60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
16d70 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ISUSE;.}.int sql
16d80 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f  ite3CantopenErro
16d90 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
16da0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
16db0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
16dc0 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
16dd0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
16de0 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20  ANTOPEN, .      
16df0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
16e00 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e  open file at lin
16e10 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
16e20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16e30 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
16e40 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
16e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16e60 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69  CANTOPEN;.}...#i
16e70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16e80 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
16e90 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
16ea0 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
16eb0 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
16ec0 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
16ed0 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
16ee0 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
16ef0 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
16f00 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
16f10 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
16f20 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
16f30 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
16f40 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
16f50 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
16f60 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
16f70 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
16f80 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
16f90 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
16fa0 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
16fb0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16fc0 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
16fd0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
16fe0 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
16ff0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
17000 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
17010 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
17020 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
17030 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23  or details..*/.#
17040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17050 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
17060 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ATA.int sqlite3_
17070 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
17080 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
17090 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
170a0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
170b0 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
170c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
170d0 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
170e0 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
170f0 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
17100 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
17110 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
17120 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
17130 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
17140 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
17150 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
17160 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
17170 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
17180 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
17190 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
171a0 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
171b0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
171c0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
171d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
171e0 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
171f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
17200 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
17210 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
17220 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
17230 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
17240 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
17250 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
17260 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
17270 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
17280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17290 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
172a0 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
172b0 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
172c0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
172d0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
172e0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
172f0 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
17300 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a   0;.  int iCol;.
17310 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
17320 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
17330 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
17340 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
17350 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
17360 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
17370 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
17380 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75   = 0;..  /* Ensu
17390 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
173a0 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
173b0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
173c0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
173d0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
173e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
173f0 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
17400 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
17410 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
17420 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
17430 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
17440 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
17450 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
17460 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
17470 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
17480 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
17490 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
174a0 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
174b0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
174c0 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
174d0 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
174e0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
174f0 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
17500 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
17510 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
17520 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77  if( sqlite3IsRow
17530 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  id(zColumnName) 
17540 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
17550 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69  ab->iPKey;.    i
17560 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
17570 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
17580 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
17590 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
175a0 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
175b0 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
175c0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
175d0 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
175e0 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
175f0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
17600 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
17610 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
17620 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17640 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
17650 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70  >nCol ){.      p
17660 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  Tab = 0;.      g
17670 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
17680 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
17690 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
176a0 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
176b0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
176c0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
176d0 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
176e0 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
176f0 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
17700 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
17710 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
17720 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
17730 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
17740 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
17750 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
17760 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
17770 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
17780 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
17790 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
177a0 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
177b0 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
177c0 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
177d0 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
177e0 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
177f0 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
17800 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
17810 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
17820 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
17830 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
17840 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
17850 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
17860 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
17870 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
17880 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
17890 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
178a0 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  e = pCol->zType;
178b0 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
178c0 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
178d0 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
178e0 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
178f0 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28   primarykey  = (
17900 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
17910 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
17920 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  )!=0;.    autoin
17930 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
17940 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
17950 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
17960 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
17970 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
17980 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
17990 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
179a0 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
179b0 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
179c0 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22      zCollSeq = "
179d0 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72  BINARY";.  }..er
179e0 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
179f0 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
17a00 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
17a10 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
17a20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
17a30 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
17a40 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
17a50 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
17a60 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
17a70 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
17a80 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
17a90 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
17aa0 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
17ab0 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
17ac0 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
17ad0 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
17ae0 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
17af0 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
17b00 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
17b10 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
17b20 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
17b30 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
17b40 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
17b50 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
17b60 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
17b70 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
17b80 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
17b90 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
17ba0 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
17bb0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
17bc0 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
17bd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17be0 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
17bf0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
17c00 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
17c10 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
17c20 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
17c30 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
17c40 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
17c50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17c60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
17c70 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
17c80 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
17c90 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
17ca0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17cb0 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
17cc0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
17cd0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
17ce0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
17cf0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
17d00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
17d10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  dif../*.** Sleep
17d20 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
17d30 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
17d40 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
17d50 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  slept..*/.int sq
17d60 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20  lite3_sleep(int 
17d70 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ms){.  sqlite3_v
17d80 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20  fs *pVfs;.  int 
17d90 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c  rc;.  pVfs = sql
17da0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
17db0 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20  ;.  if( pVfs==0 
17dc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
17dd0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17de0 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65  works in millise
17df0 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75  conds, but the u
17e00 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65  nderlying OsSlee
17e10 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73  p() .  ** API us
17e20 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  es microseconds.
17e30 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27   Hence the 1000'
17e40 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28  s..  */.  rc = (
17e50 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70  sqlite3OsSleep(p
17e60 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30  Vfs, 1000*ms)/10
17e70 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  00);.  return rc
17e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
17e90 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
17ea0 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74   extended result
17eb0 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   codes..*/.int s
17ec0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
17ed0 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c  result_codes(sql
17ee0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e  ite3 *db, int on
17ef0 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  off){.  sqlite3_
17f00 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
17f10 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
17f20 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
17f30 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
17f40 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
17f50 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
17f60 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
17f70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17f80 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
17f90 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
17fa0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
17fb0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
17fc0 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
17fd0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
17fe0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
17ff0 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
18000 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
18010 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18020 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a  ERROR;.  Btree *
18030 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74  pBtree;..  sqlit
18040 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
18050 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
18060 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
18070 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
18080 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
18090 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
180a0 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
180b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
180c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
180d0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
180e0 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
180f0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
18100 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
18110 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
18120 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
18130 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
18140 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
18150 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
18160 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
18170 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
18180 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
18190 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
181a0 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
181b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
181c0 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65  else if( fd->pMe
181d0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72  thods ){.      r
181e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
181f0 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
18200 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73   pArg);.    }els
18210 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
18220 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
18230 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
18240 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
18250 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
18260 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
18270 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
18280 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a  rn rc;   .}../*.
18290 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
182a0 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
182b0 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
182c0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
182d0 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
182e0 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64  nt rc = 0;.#ifnd
182f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
18300 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61  UILTIN_TEST.  va
18310 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
18320 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
18330 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
18340 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76     /*.    ** Sav
18350 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  e the current st
18360 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e  ate of the PRNG.
18370 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18380 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
18390 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20  _PRNG_SAVE: {.  
183a0 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53      sqlite3PrngS
183b0 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  aveState();.    
183c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
183d0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
183e0 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20  store the state 
183f0 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  of the PRNG to t
18400 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61  he last state sa
18410 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ved using.    **
18420 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20   PRNG_SAVE.  If 
18430 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65  PRNG_SAVE has ne
18440 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
18450 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  called, then.   
18460 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63   ** this verb ac
18470 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53  ts like PRNG_RES
18480 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ET..    */.    c
18490 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
184a0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
184b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
184c0 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74  3PrngRestoreStat
184d0 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
184e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
184f0 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65      ** Reset the
18500 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74   PRNG back to it
18510 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
18520 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74  state.  The next
18530 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
18540 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
18550 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64  ss() will reseed
18560 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20   the PRNG using 
18570 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20  a single call.  
18580 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e    ** to the xRan
18590 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f  domness method o
185a0 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  f the default VF
185b0 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  S..    */.    ca
185c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
185d0 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b  RL_PRNG_RESET: {
185e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
185f0 6e 67 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a  ngResetState();.
18600 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18610 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
18620 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
18630 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54  control(BITVEC_T
18640 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72  EST, size, progr
18650 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  am).    **.    *
18660 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61  * Run a test aga
18670 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62  inst a Bitvec ob
18680 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54  ject of size.  T
18690 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d  he program argum
186a0 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e  ent.    ** is an
186b0 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
186c0 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  rs that defines 
186d0 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72  the test.  Retur
186e0 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a  n -1 on a.    **
186f0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
18700 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73  on error, 0 on s
18710 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a  uccess, or non-z
18720 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72  ero for an error
18730 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65  ..    ** See the
18740 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
18750 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20  iltinTest() for 
18760 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
18770 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
18780 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18790 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
187a0 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EST: {.      int
187b0 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
187c0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
187d0 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67   *aProg = va_arg
187e0 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
187f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
18800 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
18810 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20  sz, aProg);.    
18820 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
18830 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
18840 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
18850 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
18860 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
18870 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
18880 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
18890 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
188a0 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
188b0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
188c0 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
188d0 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
188e0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
188f0 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
18900 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
18910 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
18920 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
18930 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
18940 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
18950 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
18960 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
18970 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
18980 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
18990 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
189a0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
189b0 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
189c0 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
189d0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
189e0 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
189f0 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
18a00 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
18a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18a20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
18a30 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
18a40 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
18a50 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
18a60 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
18a70 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
18a80 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
18a90 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
18aa0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
18ab0 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
18ac0 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
18ad0 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
18ae0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
18af0 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
18b00 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
18b10 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
18b20 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
18b30 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
18b40 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
18b50 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
18b60 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
18b70 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
18b80 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
18b90 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
18ba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
18bb0 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
18bc0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
18bd0 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
18be0 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
18bf0 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
18c00 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
18c10 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
18c20 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  ileterious behav
18c30 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
18c40 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18c50 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
18c60 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
18c70 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
18c80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18c90 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
18ca0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
18cb0 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
18cc0 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
18cd0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
18ce0 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
18cf0 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
18d00 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
18d10 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
18d20 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18d30 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
18d40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
18d50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
18d60 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
18d70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
18d80 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
18d90 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
18da0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
18db0 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
18dc0 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
18dd0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
18de0 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
18df0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
18e00 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
18e10 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
18e20 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
18e30 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
18e40 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
18e50 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
18e60 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
18e70 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
18e80 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
18e90 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
18ea0 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
18eb0 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
18ec0 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
18ed0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
18ee0 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
18ef0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
18f00 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
18f10 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
18f20 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
18f30 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
18f40 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18f50 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
18f60 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
18f70 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
18f80 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61  ssert( (x = va_a
18f90 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
18fa0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
18fb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18fc0 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
18fd0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
18fe0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
18ff0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
19000 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
19010 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
19020 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
19030 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
19040 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
19050 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
19060 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
19070 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
19080 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
19090 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
190a0 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
190b0 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
190c0 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
190d0 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
190e0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
190f0 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
19100 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
19110 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
19120 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
19130 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
19140 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
19150 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
19160 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
19170 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
19180 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
19190 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
191a0 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
191b0 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
191c0 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
191d0 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
191e0 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
191f0 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
19200 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
19210 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
19220 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
19230 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
19240 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
19250 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
19260 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
19270 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
19280 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
19290 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
192a0 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
192b0 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
192c0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
192d0 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
192e0 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
192f0 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
19300 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
19310 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
19320 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
19330 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
19340 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
19350 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
19360 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
19370 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
19380 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
19390 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
193a0 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
193b0 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
193c0 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
193d0 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
193e0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
193f0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
19400 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
19410 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
19420 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
19430 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
19440 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
19450 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
19460 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
19470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
19480 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
19490 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
194a0 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
194b0 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
194c0 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
194d0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
194e0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
194f0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
19500 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
19510 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
19520 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
19530 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
19540 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
19550 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
19560 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
19570 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
19580 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
19590 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
195a0 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
195b0 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
195c0 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
195d0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
195e0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
195f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19600 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
19610 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
19620 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
19630 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
19640 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
19650 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
19660 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
19670 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
19680 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
19690 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
196a0 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
196b0 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
196c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
196d0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
196e0 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
196f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
19700 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19710 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
19720 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
19730 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
19740 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
19750 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
19760 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
19770 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
19780 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
19790 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
197a0 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
197b0 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
197c0 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
197d0 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
197e0 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
197f0 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
19800 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
19810 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
19820 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
19830 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
19840 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
19850 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
19860 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
19870 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
19880 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
19890 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
198a0 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
198b0 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
198c0 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
198d0 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
198e0 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
198f0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
19900 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
19910 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
19920 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
19930 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
19940 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
19950 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31  dbOptFlags = (u1
19960 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  6)(va_arg(ap, in
19970 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20  t) & 0xffff);.  
19980 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19990 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
199a0 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a  N_KEYWORD.    /*
199b0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
199c0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
199d0 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c  TCTRL_ISKEYWORD,
199e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
199f0 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rd).    **.    *
19a00 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20  * If zWord is a 
19a10 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a  keyword recogniz
19a20 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
19a30 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
19a40 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
19a50 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  of keywords.  Or
19a60 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74   if zWord is not
19a70 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75   a keyword, retu
19a80 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  rn 0..    ** .  
19a90 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66    ** This test f
19aa0 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61  eature is only a
19ab0 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
19ac0 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e  amalgamation sin
19ad0 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51  ce.    ** the SQ
19ae0 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d  LITE_N_KEYWORD m
19af0 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
19b00 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
19b10 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a   if SQLite.    *
19b20 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67  * is built using
19b30 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65   separate source
19b40 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
19b50 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
19b60 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
19b70 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D: {.      const
19b80 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76   char *zWord = v
19b90 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
19ba0 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e  char*);.      in
19bb0 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
19bc0 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20  len30(zWord);.  
19bd0 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65      rc = (sqlite
19be0 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38  3KeywordCode((u8
19bf0 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f  *)zWord, n)!=TK_
19c00 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b  ID) ? SQLITE_N_K
19c10 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20  EYWORD : 0;.    
19c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19c30 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73  endif ..    /* s
19c40 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19c50 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19c60 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
19c70 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46  C, sz, &pNew, pF
19c80 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ree);.    **.   
19c90 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69   ** Pass pFree i
19ca0 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74  nto sqlite3Scrat
19cb0 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a  chFree(). .    *
19cc0 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61  * If sz>0 then a
19cd0 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63  llocate a scratc
19ce0 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e  h buffer into pN
19cf0 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ew.  .    */.   
19d00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
19d10 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
19d20 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  LOC: {.      voi
19d30 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65  d *pFree, **ppNe
19d40 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  w;.      int sz;
19d50 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61  .      sz = va_a
19d60 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
19d70 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72     ppNew = va_ar
19d80 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20  g(ap, void**);. 
19d90 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f       pFree = va_
19da0 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
19db0 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a        if( sz ) *
19dc0 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  ppNew = sqlite3S
19dd0 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29  cratchMalloc(sz)
19de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
19df0 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65  cratchFree(pFree
19e00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19e10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
19e20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19e30 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
19e40 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
19e50 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29  AULT, int onoff)
19e60 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
19e70 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f  If parameter ono
19e80 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ff is non-zero, 
19e90 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72  configure the wr
19ea0 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61  appers so that a
19eb0 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71  ll.    ** subseq
19ec0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f  uent calls to lo
19ed0 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61  caltime() and va
19ee0 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20  riants fail. If 
19ef0 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20  onoff is zero,. 
19f00 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20     ** undo this 
19f10 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
19f20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19f30 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
19f40 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
19f50 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
19f60 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
19f70 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
19f80 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
19f90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
19fa0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19fb0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
19fc0 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73 71  AIN).    /*   sq
19fd0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
19fe0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
19ff0 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 2c  RL_EXPLAIN_STMT,
1a000 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1a020 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f 6e  qlite3_stmt*,con
1a030 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20  st char**);.    
1a040 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f 6d  **.    ** If com
1a050 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
1a060 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1a070 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71 6c 69  PLAIN, each sqli
1a080 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a 20  te3_stmt holds. 
1a090 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20 74     ** a string t
1a0a0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
1a0b0 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61 72 73  e optimized pars
1a0c0 65 20 74 72 65 65 2e 20 20 54 68 69 73 20 74 65  e tree.  This te
1a0d0 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20 2a  st-control.    *
1a0e0 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
1a0f0 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72 69  ter to that stri
1a100 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
1a110 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1a120 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54  TRL_EXPLAIN_STMT
1a130 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1a140 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1a150 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1a160 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20 20  e3_stmt*);.     
1a170 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
1a180 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Ret = va_arg(ap,
1a190 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a   const char**);.
1a1a0 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d 20 73        *pzRet = s
1a1b0 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e  qlite3VdbeExplan
1a1c0 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70 53 74  ation((Vdbe*)pSt
1a1d0 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mt);.      break
1a1e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1a1f0 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1a200 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1a210 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
1a220 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74  VER_CORRUPT, int
1a230 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1a240 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20   Set or clear a 
1a250 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
1a260 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74  tes that the dat
1a270 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c  abase file is al
1a280 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a  ways well-.    *
1a290 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76  * formed and nev
1a2a0 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69  er corrupt.  Thi
1a2b0 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  s flag is clear 
1a2c0 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69  by default, indi
1a2d0 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20  cating that.    
1a2e0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1a2f0 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72 62  s might have arb
1a300 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f  itrary corruptio
1a310 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  n.  Setting the 
1a320 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20  flag during.    
1a330 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73 65  ** testing cause
1a340 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74  s certain assert
1a350 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
1a360 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20   the code to be 
1a370 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a  activated.    **
1a380 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74   that demonstrat
1a390 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77   invariants on w
1a3a0 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
1a3b0 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  ase files..    *
1a3c0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1a3d0 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
1a3e0 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  _CORRUPT: {.    
1a3f0 20 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e    sqlite3Config.
1a400 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76  neverCorrupt = v
1a410 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1a420 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a430 20 7d 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   }..  }.  va_end
1a440 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
1a450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
1a460 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65  TIN_TEST */.  re
1a470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a480 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
1a490 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65  ity routine, use
1a4a0 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65  ful to VFS imple
1a4b0 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74  mentations, that
1a4c0 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65   checks.** to se
1a4d0 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  e if a database 
1a4e0 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74  file was a URI t
1a4f0 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20  hat contained a 
1a500 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a  specific query .
1a510 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e  ** parameter, an
1a520 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20  d if so obtains 
1a530 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1a540 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1a550 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
1a560 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
1a570 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70  s the filename p
1a580 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e  ointer passed in
1a590 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a  to the xOpen().*
1a5a0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46  * method of a VF
1a5b0 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
1a5c0 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72  .  The zParam ar
1a5d0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
1a5e0 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65  me of the.** que
1a5f0 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20  ry parameter we 
1a600 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74  seek.  This rout
1a610 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1a620 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61  value of the zPa
1a630 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ram.** parameter
1a640 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
1a650 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
1a660 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
1a670 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1a680 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20   returns a NULL 
1a690 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
1a6a0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
1a6b0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f  uri_parameter(co
1a6c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1a6d0 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1a6e0 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20  *zParam){.  if( 
1a6f0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72  zFilename==0 ) r
1a700 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65  eturn 0;.  zFile
1a710 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1a720 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1a730 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  e) + 1;.  while(
1a740 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
1a750 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72  .    int x = str
1a760 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  cmp(zFilename, z
1a770 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c  Param);.    zFil
1a780 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
1a790 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
1a7a0 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  me) + 1;.    if(
1a7b0 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a   x==0 ) return z
1a7c0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46  Filename;.    zF
1a7d0 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1a7e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1a7f0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20  name) + 1;.  }. 
1a800 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1a810 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f  .** Return a boo
1a820 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  lean value for a
1a830 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1a840 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a850 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e  _uri_boolean(con
1a860 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1a870 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1a880 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c  zParam, int bDfl
1a890 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
1a8a0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1a8b0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1a8c0 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1a8d0 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21    bDflt = bDflt!
1a8e0 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f  =0;.  return z ?
1a8f0 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
1a900 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62  an(z, bDflt) : b
1a910 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
1a920 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69  eturn a 64-bit i
1a930 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
1a940 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
1a950 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  er..*/.sqlite3_i
1a960 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69  nt64 sqlite3_uri
1a970 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  _int64(.  const 
1a980 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1a990 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
1a9a0 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70  as passed to xOp
1a9b0 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  en */.  const ch
1a9c0 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20  ar *zParam,     
1a9d0 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74    /* URI paramet
1a9e0 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73  er sought */.  s
1a9f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66  qlite3_int64 bDf
1aa00 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  lt       /* retu
1aa10 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20  rn if parameter 
1aa20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b  is missing */.){
1aa30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1aa40 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1aa50 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1aa60 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73  me, zParam);.  s
1aa70 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a  qlite3_int64 v;.
1aa80 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74    if( z && sqlit
1aa90 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20  e3Atoi64(z, &v, 
1aaa0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1aab0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
1aac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1aad0 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20     bDflt = v;.  
1aae0 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74  }.  return bDflt
1aaf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ab00 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e  n the Btree poin
1ab10 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
1ab20 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75  y zDbName.  Retu
1ab30 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1ab40 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a  ound..*/.Btree *
1ab50 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1ab60 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  tree(sqlite3 *db
1ab70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1ab80 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  bName){.  int i;
1ab90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1aba0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1abb0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
1abc0 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62  pBt.     && (zDb
1abd0 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
1abe0 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d  e3StrICmp(zDbNam
1abf0 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  e, db->aDb[i].zN
1ac00 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  ame)==0).    ){.
1ac10 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d        return db-
1ac20 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
1ac30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ac40 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1ac50 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
1ac60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ac70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ac80 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1ac90 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
1aca0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1acb0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
1acc0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1acd0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1ace0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73    Btree *pBt = s
1acf0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1ad00 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1ad10 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
1ad20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1ad30 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
1ad40 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1ad50 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
1ad60 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
1ad70 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
1ad80 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
1ad90 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
1ada0 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
1adb0 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
1adc0 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
1add0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1ade0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
1adf0 65 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33  e *pBt = sqlite3
1ae00 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1ae10 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
1ae20 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
1ae30 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
1ae40 79 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  y(sqlite3BtreePa
1ae50 67 65 72 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a  ger(pBt)) : -1;.
1ae60 7d 0a                                            }.